PHP核心技術與最佳實務之Regex匹配規則
本文介紹幾種常用的匹配規則。
1. 字元組
尋找數字、字母、空白很簡單,因為已經有了對應這些集合的元字元,但是如果匹配沒有預定義元字元的字元集合,方法很簡單, 就是在方括弧內列出它們。
例如:[aeiou]匹配任何一個英文母音字母,[.*?]匹配標點中的一個。注意此時方括弧內的元字元失去了特殊意義。
也可以指定字元範圍,例如[0-9]的含義和\d完全一致:代表一位元字;同理[a-zA-Z0-9]等同於\w;
字元組很簡單,但是一定要弄清楚字元組中什麼時候需要轉義。
2. 轉義
如果想要尋找或匹配元字元本身,比如尋找*、。等就出現問題:沒辦法指定,因為它們會被解釋成別的意思。這時就需要\來取消這些字元的特殊意義。這叫轉義。
在PHP中使用反斜線(\)表示轉義,\Q和\E也可以在模式中忽略Regex的元字元。比如:
\d +\Q.$.\E$
以上運算式先匹配一個或多個數字,緊接著一個.點號,然後一個$,再然後一個.點號,最終是字串末尾。也就是說\Q和\E中的元字元會被作為一般字元來匹配。
3. 反義
有些時候,尋找的字元不屬於某個字元類,或者運算式和已知定義相反,(比如除了數字以外其他字元),這時需要用到反義。
常用反義:
| 常用反義 |
描述 |
| \W |
匹配任意不是字母、數字、底線、漢字的字元 |
| \S |
匹配任意不是空白符的字元 |
| \D |
匹配任意非數位字元 |
| \B |
匹配不是單詞開頭或結束的位置 |
| [^x] |
匹配除了x以外的任一字元 |
反義有一個比較明顯的特徵,就是和一些已知元字元相反,並且為大寫形式。比如”\D”就表示非數字。
1) 不包含空白符的字串
\S+
2) 用角括弧擴起來、以a開頭的字串:
<a[^>] +>
提示:
“^”這裡是非的意思,不是開頭的。如何區分。
表示開頭的 ^只能用在Regex的最前端,而表示取反的^只能用在字元組中,即只在中括弧內出現。
注意:
不要隨意使用反義,因為反義無形中擴大範圍,而使自己沒有考慮到。
4. 分支
分支就是存在多種可能的匹配情況。
(c|h|f|to|)cat
其中括弧裡的運算式將視為一個整體,分支條件指有幾種規則,無論滿足哪一種規則都能匹配,具體方法是使用“|”方法把不同的規則分隔開。
5. 分組
重複單個字元只需直接在字元後面加上限定符,但如果想重複多個字元。
常用的分組文法:
| 類別 |
文法 |
描述 |
| 捕獲 |
(exp) |
匹配exp,並捕獲文本到自動命名的組裡 |
| (?<name>exp) |
匹配exp,並捕獲文本到name的組裡 |
| (?:exp) |
匹配exp,不捕獲匹配的文本 |
| 零寬斷言 |
(?=exp) |
匹配exp前面的位置 |
| (?<=exp) |
匹配exp後面的位置 |
| (?!exp) |
匹配後面不是exp的位置 |
| (?<!exp) |
匹配前面不是exp的位置 |
| 注釋 |
(?#comment) |
注釋,不對正則有任何影響 |