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

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

一,正則表達式的元字符

正則表達式定義的模式,是由"\"+普通字符構成的,把「\」字符稱做轉義字符,是由於它把普通的字符轉義爲有特殊含義的元字符。注意,正則表達式是區分大小寫的,能夠經過表達式選擇來忽略大小寫限制。spa

1,經常使用元字符.net

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

  • .         匹配任意字符(不包括換行符)
  • ^        匹配開始位置,多行模式下匹配每一行的開始
  • $        匹配結束位置,多行模式下匹配每一行的結束
  • \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,重複字符或分組blog

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

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

3,分組,轉義,分支文檔

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

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

二,匹配字符

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

  • .         匹配任意字符,不包括換行符
  • \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_]
  • \\        轉義字符,跟在其後的字符將失去做爲特殊元字符的含義,例如\\.只能匹配.,不能再匹配任意字符

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

元字符其實是由字符「\」和普通字符構成的,「\」稱做轉義字符,也就是說,「\」的做用是把普通字符轉換爲特殊的字符。因爲元字符也是文本中的普通字符,當須要匹配這些特殊字符時,例如,文本中包含"\","."等特殊字符時,必須使用轉義字符,把特殊字符轉義爲普通字符。對於轉義字符自己,\\表示一個「\」。

使用\s匹配全部空白字符,包括:空格符,製表符,換行符和回車符。 

三,匹配位置

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

  • ^        匹配開始位置,多行模式下匹配每一行的開始
  • $        匹配結束位置,多行模式下匹配每一行的結束
  • \b       匹配位於單詞開始或結束的位置

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

四,字符組

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

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

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)+」

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

 

參考文檔:

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

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

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

相關文章
相關標籤/搜索