元字符 | 意義(以上面帶位置字符串說明) |
---|---|
^ | 行首,字符串首 表示位置0 |
$ | 行尾,字符串尾部,表示位置2 |
\b | 字分界線,可以表示:0,2位置 |
\B | 非字分界線,可以表示1位置 |
\A | 目標的開頭(獨立于多行模式) 表示位置0 |
\Z | 目標的結尾或位于結尾的換行符前(獨立于多行模式) 表示位置2 |
\z | 目標的結尾(獨立于多行模式)表示位置2 |
\G | 目標中的第一個匹配位置 |
A,Z,z,G很少使用 |
這些斷言的測試都是一些基于當前位置的測試,斷言還支持更多復雜的測試條件。更復雜的斷言以子模式方式來表示,它包括先行(前向)斷言(Lookahead assertions)和后行(后向)斷言(Lookbehind assertions),這些斷言判斷只做匹配判斷條件,不會記錄在匹配結果中,不會匹配字符。
先行斷言、正向斷言、正向巡視(Lookahead assertions)
先行斷言,常有表示(?=pattern),從當前匹配位置開始測試后面匹配字符串是否成立,還有(?!pattern)這樣兩種格式,我們來看看一個例子。源字符串:“abc100”,正則表達式是:
/[a-z]+(?=\d+)/ ,我們分析下過程如下圖:
首先由正則表達式字符 [a-z]+ 取得控制權,匹配字符:”abc”,位置從”0”開始匹配,變成3。從該位置測試/d+是否成立。匹配到字符100,返回成立。因此正則表達式正向斷言成功。返回匹配字符串”abc”
(?!pattern) 只是,正向匹配,當后面沒有匹配成功,將返回真。以下是系統(tǒng)源字符串:abc100,測試結果如下:
后行斷言、反向斷言、反向巡視(Lookbehind assertions)
后行斷言,常見表達式是:(?=pattern)或者(?!pattern)格式。正則表達式里面,不要出現(xiàn)不固定長度量詞,可能會出現(xiàn)死循環(huán)。匹配出錯。表示當前位置左邊將出現(xiàn)匹配字符,則返回真,后面匹配正常。因為如果它出現(xiàn)在最左邊,默認位置從0開始,匹配都是失敗的。一般都從后面正則表達式開始匹配,再回溯,直到匹配到為止。我們看看下面例子:源字符串:“abc100+=“,正則表達式是:”(?=\w)\w+”,匹配過程如下圖:
首先由正則表達式字符 /\w+/取得控制權,匹配字符:”abc100”,位置從”0”開始匹配,匹配到6個字符。從該位置0檢測左變\w匹配失敗。因此/\w+/從字符b開始匹配到”bc100”,測試它左側有字符”a”,反向斷言正確。因此匹配到字符串“bc100”,(?!pattern),只是沒有匹配成功返回真,其它都一樣!
后記:從這篇文章,我們發(fā)現(xiàn)搜索特點都是從左到有,一般正向斷言放到,正則表達式后,反向斷言放到匹配正則表達式前。但是,這里也可以放到前或后。這里就不再舉例。歡迎交流討論!