vim 中使用零寬度斷言,包括
符號vim符號
描述示例
vim示例
?=\@=
正先行斷言-存在
foo(?=bar)
foo\
(bar\
)\@=
?!\@!
負先行斷言-排除
foo(?!bar)
foo\
(bar\
)\@!
?<=
\@<=
正後發斷言-存在
(?<=foo)bar
\
(foo\
)\@<=bar?\@
負後發斷言-排除
(?\
(foo\
)\@
先行斷言和後發斷言都屬於非捕獲簇(不捕獲文字 ,也不針對組合計進行計數)。
先行斷言用於判斷所匹配的格式是否在另乙個確定的格式之前,匹配結果不包含該確定格式(僅作為約束)。
例如,我們想要獲得所有跟在$
符號後的數字,我們可以使用正後發斷言(?<=\$)[0-9\.]*
。
這個表示式匹配$
開頭,之後跟著0,1,2,3,4,5,6,7,8,9,.
這些字元可以出現大於等於 0 次。
?=...
正先行斷言,表示第一部分表示式之後必須跟著?=...
定義的表示式。
返回結果只包含滿足匹配條件的第一部分表示式。
定義乙個正先行斷言要使用()
. 在括號內部使用乙個問號和等號:(?=...)
。
正先行斷言的內容寫在括號中的等號後面。
例如,表示式(t|t)he(?=\sfat)
匹配the
和the
, 在括號中我們又定義了正先行斷言(?=\sfat)
, 即the
和the
後面緊跟著\nfat
。
「(t|t)he(?=\sfat)」 =>thefat cat sat on the mat.負先行斷言
?!
用於篩選所有匹配結果,篩選條件為 其後不跟隨著斷言中定義的格式。
正先行斷言 定義和 負先行斷言 一樣,區別就是=
替換成 ``! 也就是(?!...)
。
表示式(t|t)he(?!\sfat)
匹配the
和the
, 且其後不跟著\nfat
。
「(t|t)he(?!\sfat)」 => the fat cat sat onthemat.正後發斷言 記作
(?<=...)
用於篩選所有匹配結果,篩選條件為 其前跟隨著斷言中定義的格式。
例如,表示式(?<=(t|t)he\s)(fat|mat)
匹配fat
和mat
, 且其前跟著the
或the
。
「(?<=(t|t)he\s)(fat|mat)」 => thefatcat sat on themat.正後發斷言 記作
(?<=...)
用於篩選所有匹配結果,篩選條件為 其前跟隨著斷言中定義的格式。
例如,表示式(?<=(t|t)he\s)(fat|mat)
匹配fat
和mat
, 且其前跟著the
或the
。
負後發斷言 記作(?「(? the cat sat oncat.
負向零寬斷言
如果我們只是想要確保某個字元沒有出現,但並不想去匹配它時怎麼辦?例如,如果我們想查詢這樣的單詞 它裡面出現了字母q,但是q後面跟的不是字母u,我們可以嘗試這樣 b w q u w b 匹配包含後面不是字母u的字母q的單詞 但是如果多做測試 或者你思維足夠敏銳,直接就觀察出來了 你會發現,如果q出現在...
grep 零寬斷言
參考參考二 算是正則環視的乙個簡單應用吧。前兩天因為第三方遊戲伺服器掉線,導致大量使用者同時登入我的伺服器,將伺服器負載瞬間提高到200 如此恐怖的數字讓我不得不考慮增加伺服器來抵抗問題重現,然而我的伺服器平時負載都很低,0.1都不到,增加伺服器來應付這樣短暫的風暴未免太過於浪費,於是我決定從日誌下...
負向零寬斷言
前面我們提到過怎麼查詢不是某個字元或不在某個字元類裡的字元的方法 反義 但是如果我們只是想要確保某個字元沒有出現,但並不想去匹配它時怎麼辦?例如,如果我們想查詢這樣的單詞 它裡面出現了字母q,但是q後面跟的不是字母u,我們可以嘗試這樣 b w q u w b匹配包含後面不是字母u的字母q的單詞。但是...