1. 程式人生 > 其它 >正則表示式詳解01

正則表示式詳解01

正則表示式語法:

  正則表示式描述了一種字串匹配的模式,可以用來檢查一個字串是否含有某種字串、將匹配的子串做替換或者從某個串中取出複核某個條件的子串等。

  在linux中 列目錄時,dir *txt 或者 ls *.txt中的 *.txt就不是一個正則表示式,因為這裡的* 和 正則表示式中的*的含義不同

       構造正則表示式的方法和建立數學表示式的方法一樣。也就是用多種元字元與運算子可以將小的表示式結合在一起來建立更大的表示式。正則表示式的元件可以使單個字元、字符集、字元範圍、字元間的選擇或者所有這些元件的任意組合。

正則表示式由普通字元(例如a-z)以及特殊字元(稱為 “元字元”)組成的文字模式。模式描述在搜尋文字時要匹配的一個或者多個字串。正則表示式作為一個模板,將某個字元模式與所搜尋的字串進行匹配。

普通字元:

  普通字元包括沒有顯式指定為元字元的所有可列印和不可列印字元。這包括所有大小寫字母、所有數字、所有標點符號和一些其他符號。

非列印字元:

  非列印字元也可以是正則表示式的組成部分。下表列出了表示非列印字元的轉義序列:

字元 描述
\cx 匹配由x指明的控制字元。例如,\cM 匹配一個Control-M或回車符。x的值必須為A-Z或者a-z之一。否則,將c視為一個原義的‘c’字元
\f 匹配一個換頁符。等價於\x0c和\cL
\n 匹配一個換行符。等價於\x0a 和 \cJ
\r 匹配一個回車符。等價於\x0d 和\cM
\s 匹配任何空白字元,包括空格、製表符、換頁符等等,等價於[\f\n\r\t\v]
\S 匹配任何非空白字元。等價於[^\f\n\r\t\v]
\t 匹配一個製表符。等價於\x09 和\cl
\v 匹配一個垂直製表符。等價於\x0b 和 \cK

特殊字元:

所謂特殊字元,就是一些有特殊含義的字元,如上面所說的 *.txt 中的 * ;簡單的說就是表示任何字串的意思。如果要查詢檔名中有*的檔案,則需要進行轉義,即在前加一個\.

ls  \*.txt

許多元字元要求在試圖匹配它們時特別對待。若要匹配這些特殊字元,必須首先使字元“轉義”,即,將反斜槓字元(\)放在它們前面。下表列出了正則表示式中的特殊字元:

特別字元 描述
$ 匹配輸入字串的結尾位置。如果設定了RegExp物件的Multiline屬性,則$也匹配成\n或\r。若要匹配$ 字元本身使用\$
( ) 標記一個表示式的開始和結束位置。子表示式可以獲取供以後使用。要匹配 括號字元,請使用\( 和\)
* 匹配前面的字表達式零次或多次。要匹配*字元,請使用\*
+ 匹配前面的字表達式一次或多次。要匹配+ 請使用\+
. 匹配除換行符意外的任何單字元.要匹配. 請使用\.
[ 標記一箇中括號表示式的開始。要匹配[ 請使用\[
? 匹配前面的字表達式零次或一次,或指明一個非貪婪限定符。要匹配?請使用\?
\ 將下一個字元標記為或特殊字元、或原義字元、或向後引用、或八進位制轉義符。例如, 'n' 匹配字元 'n'。'\n' 匹配換行符。序列 '\\' 匹配 "\",而 '\(' 則匹配 "("。
^ 匹配字元輸入字串的開始位置,除非放在[ ]表示式中使用時表示中括號中字符集取反。要匹配^ 字元本身,請使用\^
{ 標記限定符表示式的開始。要匹配 {,請使用 \{。
| 指明兩項之間的一個選擇。要匹配 |,請使用 \|。

限定符:

  限定符用來指定正則表示式的一個給定元件必須要出現多少次才能滿足匹配。 有 * 或 + 或 ? 或{n} 或 {n,} 或{n,m}6種。

正則表示式的限定符有:

字元 描述
* 匹配前面的字表達式零次或者多次,例如,zo* 能匹配到 z 以及 zoo。
+ 匹配前面的子表示式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等價於 {1,}。
? 匹配前面的子表示式零次或一次。例如,"do(es)?" 可以匹配 "do" 、 "does" 中的 "does" 、 "doxy" 中的 "do" 。? 等價於 {0,1}。
{n} n 是一個非負整數。匹配確定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的兩個 o。
{n,} n 是一個非負整數。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等價於 'o+'。'o{0,}' 則等價於 'o*'。
{n,m} m 和 n 均為非負整數,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 將匹配 "fooooood" 中的前三個 o。'o{0,1}' 等價於 'o?'。請注意在逗號和兩個數之間不能有空格。