使用零寬斷言來匹配不包含連續字串的行

2021-08-31 08:20:29 字數 1166 閱讀 4891

最近在工作中遇到乙個問題,有n個字串,需要用正規表示式去過濾掉不包含某乙個特定連續字串(比如abc)的字串。

在網上蒐羅了一大把,找到了在perl 5的正規表示式中有零寬斷言這個東西,非常強大,先來了解下零寬斷言倒是是什麼?

簡單的說,零寬斷言是查詢在某些內容之前或者之後的東西,這樣解釋起來可能比較抽象,我們來具體看下幾種零寬斷言:

在理解零寬斷言的時候需要注意的一點是它是一種斷言,也就是說零寬斷言只會告訴你匹不匹配,但是不會「消費」掉字串內的內容,我用下面的這乙個例子來解釋這個情況:

我們有乙個正規表示式k(?=h)otyn,用它去匹配khotyn,乍看一下這個匹配是會成功的,但是由於零寬斷言只做斷言,而不會"消費"掉匹配到的字串,所以事實上,這個正規表示式匹配是乙個後面是h的k,並且這個k的後面是otyn,這樣這個正規表示式無論什麼字串都會匹配失敗(正確的應該是k(?=h)hotyn,不過這樣加不加零寬斷言並沒有意義)。

在理解零寬斷言以後,我們來看一下如何來匹配出不包含「abc」的字串,下面是我寫出的結果:

((?!abc).)+
首先我們看這個正規表示式裡面的「(?!abc).」部分,這個部分斷言乙個空字元後面不能夠匹配到字串abc,並且這個空字串後面是乙個任意字元。

我們來看下下面這一段**:

pattern pattern = new perl5compiler().compile("((?!abc).)+");

perl5matcher matcher = new perl5matcher();

system.out.println(matcher.matches("abc", pattern));

system.out.println(matcher.matches("abdas dfas", pattern));

這段**的執行結果是:

false

true

第乙個匹配失敗是因為在字元'a'前面的空字元後面匹配到了字串"abc",因此斷言失敗,從而匹配失敗。

第二個匹配成功是因為沒有任何乙個空字元後面有出現"abc",因為匹配成功。

最後加上+號的原因是因為能夠做到完全匹配,因為任何乙個字元只要其本身不是『a』,並且後面不是『bc』,那麼就是能夠匹配"(?!abc)."的,因此,只要乙個字串裡面不包含abc,那麼它就能夠完全匹配((?abc).)+

不包含某字串的字串匹配 正規表示式

判斷乙個字串中是否含有另一字串,有很多方法,如下 1.常見函式 strstr str,abc 2.正則匹配 preg match abc is str 但是要匹配乙個字串中,不包含某字串,用正則就比較麻煩了。1.如果不用正則如下就可以解決問題 strstr str,abc 2.但是用正則呢,就只有這...

包含「?」和「 」的萬用字元字串匹配

題目描述 str1中可能包含的字元 除了 和 以外的任意字元。str2中可能包含的字元 任意字元。其中,表示匹配任意乙個字元,表示匹配任意字元0或者多次。給出這樣兩個字串,判斷str2是否是str1的子串,如果是輸出第乙個匹配到的子串的初始位置,如果不是,輸出 1 如下 includeusing n...

Perl不包含某個字串的正則匹配

一 幾個問題 1.找出不包含 abc 的字串 測試用例1 abc 不符合 測試用例2 xabc 不符合 測試用例3 abcy 不符合 測試用例4 xabcy 不符合 測試用例5 x xabcy 不符合 測試用例6 abcy dabc 不符合 測試用例7 abcy 不符合 測試用例8 xyz 符合 2...