正則表達式 第一篇:元字符


規則表達式(Regular Expression),又稱作正則表達式,通常用於檢索、替換符合指定規則的文本,正則表達式定義的規則,稱作模式(Pattern),即正則表達式的作用是從文本中查找到符合模式的文本。

一,正則表達式的元字符

正則表達式定義的模式,是由"\"+普通字符構成的,把“\”字符稱作轉義字符,是因為它把普通的字符轉義為有特殊含義的元字符。注意,正則表達式是區分大小寫的,可以通過表達式選擇來忽略大小寫限制。

1,常用元字符

用以匹配特定的字符(字母,數字,符號),注意字母是區分大小寫的:

  • .         匹配任意字符(不包括換行符)
  • ^        匹配開始位置,多行模式下匹配每一行的開始
  • $        匹配結束位置,多行模式下匹配每一行的結束
  • \A      匹配字符串的開始位置
  • \Z      匹配字符串的結束位置
  • \b       匹配位於每個單詞的開始或結束位置
  • \B    匹配不是單詞開頭和結束的位置,即每個單詞的中間位置
  • \d       匹配一個數字, 相當於 [0-9]
  • \D       匹配非數字,相當於 [^0-9]
  • \s        匹配任意空白字符, 相當於 [ \t\n\r\f\v]
  • \S       匹配非空白字符,相當於 [^ \t\n\r\f\v]
  • \w       匹配數字、字母、下划線中任意一個字符, 相當於 [a-zA-Z0-9_]
  • \W      匹配非數字、字母、下划線中的任意字符,相當於 [^a-zA-Z0-9_]
  • \         轉義字符,把元字符轉義為普通字符

2,重復字符或分組

指定前面一個字符或分組重復的次數:

  • * :重復零次或更多次
  • + :重復一次或更多次
  • ? :重復零次或一次
  • {n} :重復n次
  • {n,} :重復n次或更多次
  • {n,m} :重復n到m次

3,分組,轉義,分支

這些字符有特定的含義和用途:

  • () : 用小括號表示一個分組
  • \ : 轉義字符,將特殊字符轉移為普通字符,例如:"\("  表示小括號“(”,小括號不再作為特殊字符
  • | : 分支,子表達式之間是“或”的關系
  • [...] : 指定限定字符列表,一個字符必須匹配列表中任意一個字符,在中括號中指定匹配的字符列表,例如:[aeiou] 一個字符必須aeiou中的任意一個;
  • [-]:連字符,在字符組中,連字符出現在字符中間,表示連續的字符序列,例如,[0-9]表示從0到9的數字;
  • [^... ] : 指定排除字符列表,一個字符不能是排除列表中的任意一個字符,中括號中指定排除的字符列表,例如:[^aeiou] 一個字符不能是aeiou中的任意一個;

4,正則表達式中需要轉義的字符

* . ? + $ ^ [ ] ( ) { } | \ ,在這些字符前面加上轉義字符\,才表示字面意義上的字符。

二,字符類,匹配字符

匹配字符是指在元字符所在的位置處,匹配一個字符:

  • .         匹配任意字符,不包括換行符
  • \d       匹配一個數字, 相當於 [0-9]
  • \D       匹配非數字,相當於 [^0-9]
  • \s        匹配任意空白字符, 相當於 [ \t\n\r\f\v]
  • \S        匹配非空白字符,相當於 [^ \t\n\r\f\v]
  • \w        匹配數字、字母、下划線中任意一個字符, 相當於 [a-zA-Z0-9_]
  • \W       匹配非數字、字母、下划線中的任意字符,相當於 [^a-zA-Z0-9_]
  • \char    轉義字符,跟在其后的字符將失去作為特殊元字符的含義,例如\.只能匹配.,不能再匹配任意字符
  • 普通字符   普通字符直接匹配,注意大小寫

注意:正則表達式是區分大小寫的,元字符的大寫和小寫形式表示的含義是不同的;文本字符的大小寫也是不同的。

元字符實際上是由字符“\”和普通字符構成的,“\”稱作轉義字符,也就是說,“\”的作用是把普通字符轉換為特殊的字符。由於元字符也是文本中的普通字符,當需要匹配這些特殊字符時,例如,文本中包含"\","."等特殊字符時,必須使用轉義字符,把特殊字符轉義為普通字符。對於轉義字符本身,\\表示一個“\”。

使用\s匹配所有空白字符,包括:空格符,制表符,換行符和回車符。 

1,匹配任意空白字符

2,匹配任意非空白字符

 

3,匹配數字、字母、下划線中任意一個字符

4,匹配非數字、字母、下划線中任意一個字符

5,匹配一個單詞

單詞的開始和結束,使用\b,單詞是由多個字符構成的,至少由一個,因此是\w+,把元字符組合成一個匹配單詞的正則表達式是:\b\w+\b

三,定位符,匹配位置

元字符中匹配位置的元字符主要是:

  • ^        匹配開始位置,多行模式下匹配每一行的開始
  • $        匹配結束位置,多行模式下匹配每一行的結束
  • \b       匹配位於每個單詞的開始或結束的位置
  • \B      匹配每個每個單詞的不是開始或結束的位置,即單詞中間的位置
  • \A      匹配字符串的開始位置
  • \Z      匹配字符串的結束位置

匹配位置的元字符不占用字符,只是匹配一個位置,例如,\b 表示匹配一個位置,並不占用任何字符,這個位置的一側是單詞字符,一側為非單詞字符。

1,匹配每行的開始位置

2,匹配結束位置

3,匹配每個單詞的開始和結束位置

4,匹配每個單詞的中間位置

5,匹配字符串開始的位置

在多行模式下,只匹配字符串的起始位置

6,匹配字符串的結束位置

在多行模式下,只匹配字符串的結束位置

 

四,字符組

字符組是若干字符的組合,表示只匹配其中一個字符:

  • [...]        字符組,一個字符的集合,可匹配其中任意一個字符
  • [  -  ]      連字符,表示一個范圍
  • [^...]       排除字符

1,字符組

如果要匹配字符grey和gray,可以使用字符組: gr[ae]y,該正則表達式的意思是:先找到字符gr,然后跟着一個a或e,最后是一個字符y。

注意:在字符組以外,普通字符(如gr[ae]y中的g和r)都有接下來是(and then)的意思,這與字符組內部的情況是完全相反的。字符組的內容是在同一個位置能夠匹配的若干字符,所以他的意思是“或”。如“[0123456789]”就是匹配1到9之間的任意一個數字。如果“<H[1234]>”就是用來匹配<H1>,<H2>,<H3>,<H4>。 

2,連字符

在字符組內部“-”(連字符)出現在兩個字符中間,表示一個范圍,例如:

  • “<H[1234]>”與“<H[1-4]>”是完全一樣的;
  • [0-9]和[a-z]是常用的匹配數字和小寫字母的簡便方式
  • 多重范圍也是允許的,如“[0123456789abcdeABCDE]“可以寫作”[0-9a-eA-E]“

注意:只有在字符組內部,連字符才是元字符,否則他就是只能匹配普通的連字符號。連字符還有一個例外,即使在字符組內部,如果連字符出現在字符組的開頭(或排除型字符組的開頭,下面會講,如[^-]),那也不是元字符而只是一個普通字符。同樣的道理,問號和點號(后面會講到這兩個元字符)通常被當做元字符處理,但在字符組里則不是如此。只有連字符和^(下面馬上講到,是排除字符)才可能是字符組里的元字符(但是轉義符,字符組簡記法仍然有效,即[\da-zA-Z]或[^\da-zA-Z]或[\\"]中的\仍然有轉義的含義,\d仍然代表數字,\\"仍然代表字符串中的“\"”單獨的\不會匹配任何字符,\\會匹配字符'\')。相當於字符組內部有一個自己獨立的小世界,有自己的規則。

3,字符組內的排除字符

用“[^…]”取代“[…]”,這個字符組就會匹配任何未列出的字符。例如”[^1-8]”匹配除了1到8以外的任何字符。注意:這句話有兩層含義,一個是排除1-8字符,另一個是一定要匹配一個字符。 
例子:匹配q后面不是u的字符,正則是”q[^u]”。那么qi會被匹配。那Qantas呢?Iraq呢?答案是這兩個都不會被匹配,一個是因為Q是大寫,一個是因為q在最后,后面沒有除了u以外的任何字符。再次注意,排除型字符組也是要匹配一個字符的。 

五,量詞

 量詞用於設置匹配前面一個字符的次數:

  • *        匹配前一個元字符0到多次
  • +        匹配前一個元字符1到多次
  • ?        匹配前一個元字符0到1次
  • {m,n}  匹配前一個元字符m到n次

問號,加號和星號統稱為量詞,表示前面一個字符的重復次數。

1,可選字符 ?

這些元字符,只用於匹配相鄰的前一個字符;如果要匹配多個字符,需要使用(),那么用於表示()內的字符重復,例如:

  • 對於正則 colou?r,表示color或colour, “u?”表示:u要么出現一次,要么不出現,元字符?只作用於前面緊鄰的元素;
  • 對於正則 4(th)?,用於表示4或4th,(th)?表示:th要么出現一次,要么不出現,當元字符?前面緊鄰的元素是()時,把()作為一個元素來對待。

把()作為一個整體來看待,是一個元素,括號內的元素可以很多。

2,“+(加號)”和”*(星號)”

+和*的作用與?類似,元字符”+”表示“前面緊鄰的元素出現一次或多次”;而元字符”*”表示“前面緊鄰的元素不出現或出現任意多次”,換種說法就是”*”表示匹配盡可能多的次數,但如果一次都不匹配也沒關系。”+”表示匹配盡可能多的次數,但如果一次都不匹配就報告失敗。

3,區間量詞

區間量詞“{min, max}” 表示重復次數的范圍,其中min為下限,如果min為空,表示沒有下限;max為上線,如果max為空,表示沒有上限。例如,對於正則 ”a{3,12}”表示能夠容許a出現3到12次,用區間量詞來表示其他量詞:問號對應“{0,1}”,加號對應”{1,}”, 星號對應”{0,}”

六,選擇分支

元字符“|”,表示“或(or)”關系,表示從多個候選的子表達式中,只需要匹配一個。子表達式的范圍是由()來限制的,如果沒有(),那么以元字符“|”,把表達式分割為兩個子表達式,例如:

  • “Bob”和“Robert”是兩個表達式,通過元字符"|"把這兩個表達式組合成一個表達式:“Bob|Robert”,表示只需要匹配其中任意一個子表達式即可。 
  • 對於上面的“gr[ea]y”例子,還可以寫作“grey|gray”或者“gr(a|e)y”,后者用括號來划定多選結構的范圍
  • 請注意,“gr[a|e]y”不符合我們的需求,在這里,“|”只是一個和“a”與“e”一樣的普通字符,在字符組內部|不是元字符。 

“gr[ea]y”與“gr(a|e)y”的例子可能會讓人覺得多選結構與字符組沒太大的區別,但是不要混淆這兩個概念。一個字符組只能匹配目標文本中的單個字符,而每個多選結構自身可能是完整的正則表達式,都可以匹配任意長度的文本。 

比較”^From|Subject|Date:*”和”^(From|Subject|Date):*”會發現匹配結果大不相同,第一個表達式由3個多選分支構成,能匹配”^From”或”Subject”或”Date:*”,實用性不大。我們希望在每一個多選分支前都有脫字符,之后都有”:*”,所以應該使用括號來限制這些多選分支: ”^(From|Subject|Date):*”,含義是匹配以“From:*”或“Subject:*”或“Date:*”開頭的文本行。

七,分組

()是分組元字符,最常見的用途是:

  • 限制多選項的范圍,如“gr(a|e)y”;
  • 將若干字符組合為一個單元,受問號或星號之類量詞的作用,如:”(cat|dog)+”

還有一個作用是環視,下文分享。 

 

參考文檔:

Online Regular tester

<基礎-1> 正則表達式:元字符

正則表達式30分鍾入門教程

正則表達式匹配不包含某些字符串的技巧


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM