正規表達式 - 文法
正規表達式(regular expression)描述了一種字元串比對的模式,可以用來檢查一個串是否含有某種子串、将比對的子串做替換或者從某個串中取出符合某個條件的子串等。
- 列目錄時, 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 和 \cI。 |
\v | 比對一個垂直制表符。等價于 \x0b 和 \cK。 |
特殊字元
所謂特殊字元,就是一些有特殊含義的字元,如上面說的"*.txt"中的*,簡單的說就是表示任何字元串的意思。如果要查找檔案名中有*的檔案,則需要對*進行轉義,即在其前加一個\。ls \*.txt。
許多元字元要求在試圖比對它們時特别對待。若要比對這些特殊字元,必須首先使字元"轉義",即,将反斜杠字元 (\) 放在它們前面。下表列出了正規表達式中的特殊字元:
特别字元 | 描述 |
---|---|
$ | 比對輸入字元串的結尾位置。如果設定了 RegExp 對象的 Multiline 屬性,則 $ 也比對 '\n' 或 '\r'。要比對 $ 字元本身,請使用 \$。 |
( ) | 标記一個子表達式的開始和結束位置。子表達式可以擷取供以後使用。要比對這些字元,請使用 \( 和 \)。 |
* | 比對前面的子表達式零次或多次。要比對 * 字元,請使用 \*。 |
+ | 比對前面的子表達式一次或多次。要比對 + 字元,請使用 \+。 |
. | 比對除換行符 \n之外的任何單字元。要比對 .,請使用 \。 |
[ | 标記一個中括号表達式的開始。要比對 [,請使用 \[。 |
? | 比對前面的子表達式零次或一次,或指明一個非貪婪限定符。要比對 ? 字元,請使用 \?。 |
\ | 将下一個字元标記為或特殊字元、或原義字元、或向後引用、或八進制轉義符。例如, 'n' 比對字元 'n'。'\n' 比對換行符。序列 '\\' 比對 "\",而 '\(' 則比對 "("。 |
^ | 比對輸入字元串的開始位置,除非在方括号表達式中使用,此時它表示不接受該字元集合。要比對 ^ 字元本身,請使用 \^。 |
{ | 标記限定符表達式的開始。要比對 {,請使用 \{。 |
| | 指明兩項之間的一個選擇。要比對 |,請使用 \|。 |
限定符
限定符用來指定正規表達式的一個給定元件必須要出現多少次才能滿足比對。有*或+或?或{n}或{n,}或{n,m}共6種。
正規表達式的限定符有:
字元 | 描述 |
---|---|
* | 比對前面的子表達式零次或多次。例如,zo* 能比對 "z" 以及 "zoo"。* 等價于{0,}。 |
+ | 比對前面的子表達式一次或多次。例如,'zo+' 能比對 "zo" 以及 "zoo",但不能比對 "z"。+ 等價于 {1,}。 |
? | 比對前面的子表達式零次或一次。例如,"do(es)?" 可以比對 "do" 或 "does" 中的"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?'。請注意在逗号和兩個數之間不能有空格。 |
定位符
定位符使您能夠将正規表達式固定到行首或行尾。它們還使您能夠建立這樣的正規表達式,這些正規表達式出現在一個單詞内、在一個單詞的開頭或者一個單詞的結尾。
定位符用來描述字元串或單詞的邊界,^和$分别指字元串的開始與結束,\b描述單詞的前或後邊界,\B表示非單詞邊界。
正規表達式的限定符有:
字元 | 描述 |
---|---|
^ | 比對輸入字元串開始的位置。如果設定了 RegExp 對象的 Multiline 屬性,^ 還會與 \n 或 \r 之後的位置比對。 |
$ | 比對輸入字元串結尾的位置。如果設定了 RegExp 對象的 Multiline 屬性,$ 還會與 \n 或 \r 之前的位置比對。 |
\b | 比對一個字邊界,即字與空格間的位置。 |
\B | 非字邊界比對。 |
注意:不能将限定符與定位點一起使用。由于在緊靠換行或者字邊界的前面或後面不能有一個以上位置,是以不允許諸如 ^* 之類的表達式。
若要比對一行文本開始處的文本,請在正規表達式的開始使用 ^ 字元。不要将 ^ 的這種用法與中括号表達式内的用法混淆。
若要比對一行文本的結束處的文本,請在正規表達式的結束處使用 $ 字元。
若要在搜尋章節标題時使用定位點,下面的正規表達式比對一個章節标題,該标題隻包含兩個尾随數字,并且出現在行首: