用正則表達(dá)式找出不包含連續(xù)字符串a(chǎn)bc的單詞
[^abc]表示不包含a、b、c中任意字符, 我想實(shí)現(xiàn)不包含字符串a(chǎn)bc應(yīng)該如何寫(xiě)表達(dá)式?就我自己而言,這個(gè)問(wèn)題最簡(jiǎn)單的解決方法是使用編程語(yǔ)言的配合,找出那些包含abc的,剩下的就是不包含的了——懶人的風(fēng)格。但我寫(xiě)的是教程,讀者未必都有編程的基礎(chǔ),有些只是使用一些工具從txt文檔中抽取出一些信息,所以要回答還是必須完全通過(guò)正則表達(dá)式來(lái)完成。
于是打開(kāi)了RegexTester,開(kāi)始試驗(yàn),先是試了使用((?'test'abc)|.)*(?(test)(?!))(含意是:查找abc,或任意的字符,如果找到了abc,就把它存入命名為test的組里,到最后檢查test組里是否有內(nèi)容,如果有就匹配失敗,相關(guān)說(shuō)明見(jiàn)教程),結(jié)果是"abc","aabc","abcd","aa"都能通過(guò)測(cè)試,看來(lái)是到最后測(cè)試到test組存在后又回溯了,此解決方案不可行。
然后又試了(.(?!abc))*(找出所有后面不是abc的字符),結(jié)果是"abc","abcd"通過(guò)測(cè)試,"aabc"則只截取了后面的"abc",顯然不行。
那加強(qiáng)條件試試:((?<!abc).(?!abc))*(找出所有前面和后面都不是abc的字符),結(jié)果是所有包含abc的字符串都只截取了里面的"abc",不包含abc的則直接通過(guò)。
現(xiàn)在看來(lái)有點(diǎn)戲了,但是怎么把那些內(nèi)部包含abc的字符串過(guò)濾掉呢?這個(gè)問(wèn)題換句話說(shuō)也就是怎么匹配整體而不是部分呢?現(xiàn)在需要明確用戶(hù)的需求了:如果用戶(hù)想要找的是單詞,那就在表達(dá)式的兩端加上\b,如果要找的是行,就加上^和$。由于用戶(hù)的問(wèn)題沒(méi)有明確說(shuō)明,我就當(dāng)作是單詞吧。
于是等到了這樣的表達(dá)式:\b((?<!abc).(?!abc))*\b,經(jīng)過(guò)測(cè)試,這個(gè)表達(dá)式能匹配所有不包含abc的單詞,以及單詞abc。
怎么排除單詞abc?經(jīng)過(guò)一番思考,最后我認(rèn)為判斷單詞是否以a開(kāi)頭的方式最為方便:\b(a(?!bc)|[^a](?!abc))((?<!abc).(?!abc))*\b(要么以后面不是bc的a開(kāi)頭,要么不以a開(kāi)頭,除了開(kāi)頭后面所有的字符必須前面和后面都不是abc)。經(jīng)過(guò)測(cè)試,完全滿(mǎn)足要求,Bingo!
使用正則表達(dá)式查找不包含連續(xù)字符串a(chǎn)bc的單詞,最終結(jié)果:\b(a(?!bc)|[^a](?!abc))((?<!abc).(?!abc))*\b
----------------
更新:根據(jù)maple的評(píng)論,更簡(jiǎn)潔的作法是:\b((?!abc)\w)+\b
posted on 2007-02-15 23:07 deerchao 閱讀(14513) 評(píng)論(31) 編輯 收藏





