顯示廣告
隱藏 ✕
看板 Knuckles_note
作者 Knuckles (站長 那克斯)
標題 [PHP] Regular Expression: Assertions
時間 2011年10月09日 Sun. AM 03:26:15


PCRE regex syntax / Assertions
翻譯一下PHP官方網站對於 assertions 的說明

Assertion 用來表達位置的符號,不會吃掉字元

例如

^  : 符合整個字串的開頭;在multiline模式,代表一行的開頭
$  : 符合整個字串的結尾;在multiline模式,代表一行的結尾
\b : 符合一個單字邊界(word boundary),一邊是\w一邊是\W
\B : 符合一個非單字邊界,兩邊都是\w 或兩邊都是\W
\A : 只符合整個字串的開頭 (不受multiline模式影響)
\Z : 只符合整個字串的結尾,或是結尾換行前 (不受multiline模式影響)
\z : 只符合整個字串的結尾 (不受multiline模式影響)
\G : 若使用preg_match有設offset時,代表offset的位置,offset為0時就與\A相同

                                                        參考 Escape sequences


如果是要表達前後是否為某個字串,但不要把這字串抓進來的話,有分為

Lookahead 看後面

(?=abc) : positive 接下來必需是abc
(?!abc) : negative 接下來不能是abc

Lookbehind 看前面

(?<=abc) : positive 前面是接abc
(?<!abc) : negative 前面不是接abc

舉例

\w+(?=;)  只會抓到後面有接;\w+,但不會把;抓進來
foo(?!bar)  會抓到所有後面不是接barfoo
(?!foo)bar  錯誤用法,因為後面不可能同時是foo又是bar,這樣所有的bar都會抓到
            如果想要前面不是接foo的話,要用Lookbehide的用法
(?<!foo)bar  這樣才對,會抓到所有前面不是接foobar

可以使用(?<=bullock|donkey)來抓前面是bullockdonkey的字串
但要注意lookbehind的用法時,所有匹配的字串可以分別為不同長度,但每個必需是固定的長度
例如 (?<!dogs?|cats?) 就不行
要匹配不同長的字串也僅至於最上層的分支,像 (?<=abc|abde) 可以,但 (?<=ab(c|de)) 就不行

Assertions可以連續使用
例如 (?<=\d{3})(?<!999)foo 可以抓到前面是3個非999數字的foo
注意這兩個assertions都是檢查同一個位置,所以不會抓到前面接6個字元的foo
像 123abcfoo 的foo就不會被抓到,如果要抓像這樣的foo,要用 (?<=\d{3}...)(?<!999)foo

Assertions可以巢狀使用
例如 (?<=(?<!foo)bar)baz 可以抓到 前面是 bar 且 bar 的前面不是 foo 的 baz
例如 (?<=\d{3}...(?<!999))foo 可以抓到 前面是 3個數字與3個非999字元 的foo


--
※ 作者: Knuckles 時間: 2011-10-09 03:26:15
※ 編輯: Knuckles 時間: 2011-10-11 05:22:32
※ 看板: KnucklesNote 文章推薦值: 2 目前人氣: 0 累積人氣: 863 
( ̄︶ ̄)b pig, tails 說讚!
e)編輯 d)刪除 ^x)轉錄 同主題: =)首篇 [)上篇 ])下篇