正規表示式是一種進階的字串比對,用「符號」描述字串的樣式,說明某個位置可以是哪些字元、符合的次數等。只要了解這些特殊「符號」,英文稱 metacharacter,可翻作「字元符」,就可以了解正規表示式。正規表示式在許多地方都可以見到,例如 grep、sed、vi、JavaScript、git grep、IMS PSI 等。
字元描述
大部分字元,包括英文字母及數字,代表的就是它自己。其它的是有特殊意義的符號,可描述字元、位置、次數等。- .:任何字元。
- \:跳脫字元,跳脫下個字元原本的解釋,原本是 metacharacter,就不解釋為 metacharacter。原本不是 metacharacter,改解釋為 metacharacter。
- \d:數字。
- \D:非數字,和 \d 相反。
- \s:
- \S:
- []: bracket 表示式,[] 包起來,內含比對單一字元符合的列表。但如果內容以 ^ 開頭,則為不包含的列表。
- 可用「-」表示範圍。例如「a-d」相當於「abcd」(在有些 locale 的字典順序不同,會變成「aBbCcDd」)。
- 列表中也可以包含特定事先定義的類別,包括 [:alnum:], [:alpha:], [:blank:], [:cntrl:], [:digit:], [:graph:],[:lower:], [:print:], [:punct:], [:space:], [:upper:], 和 [:xdigit:]。注意,這裡的 [] 是類別名稱的一部分,[[:alnum:]] 代表數字及英文字母。
- 大多 metacharacter 在 [] 裡失去其原本的特殊意義。要解除 ] 特殊意義,可放在列表第一個,^ 就不要放在第一個,- 放在最後。
- \w:底線、數字或英文字母,相當於 [_[:alnum:]]。
- \W:和 \w 相反,相當於 [^_[:alnum:]]。
位置描述
代表位置- ^:行開頭
- $:行結尾
- \< 及 \>
- \b
- \B
次數描述
說明重複的次數,沒有的話就是一次。- { }:重複次數。{2} 表重複兩次,{2,5} 表重複 2 至 5 次,{2,} 表兩次以上
- *:0 次以上,相當於 {0,}。
- +:1 次以上,相當於 {1,}。
- ?:0 次或 1 次,相當於 {0,1}。
Alternation
|subexpression
()返回參考
\n:n 是一位數字,代表前面第 n 個 subexpression 符合的子字串。BRE 和 ERE
一開始的正規表示式只支援 [、]、.、^、$、*,稱為 BRE (Basic Regular Expressions)。後來 POSIX 的 BRE 新增字元符來擴充功能,但為了相容,這些字元符前面需要加反斜線跳脫。而 POSIX ERE 則相反。ERE:chapter 9 in IEEE 1003.1-2004 Part 1
| BRE | POSIX BRE | ERE | |
|---|---|---|---|
| 基本字元符 | 支援 | 支援 | 支援 |
| 跳脫基本字元符 | 反斜線 | 反斜線 | 反斜線 |
| 擴充字元符 | 一般字元 | 反斜線跳脫 | 支援 |
| 跳脫擴充字元符 | ? | 支援 | 反斜線 |
PCRE (Perl-compatible Regular Expressions)
- 凡是標點符號, 加上倒斜線, 一定沒有特殊意義。
- 常用的 [...] 定義了簡寫:
- \d:[0-9], "任何一個數字"
- \D:[^0-9], "任何一個非數字"
- \w:[a-zA-Z0-9_], "任何一個文數字",不同 locale 有所不同。
- \W:[^a-zA-Z0-9_], "任何一個非文數字"
- \s:[ \t\n], "任何一個空白類字元"
- \S:[^ \t\n], "任何一個非空白類字元"
- ...
沒有留言:
張貼留言