小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

用正則表達(dá)式找出不包含連續(xù)字符串a(chǎn)bc的單詞

 googo 2011-07-15

用正則表達(dá)式找出不包含連續(xù)字符串a(chǎn)bc的單詞

寫(xiě)過(guò)一篇"正則表達(dá)式30分鐘入門(mén)教程",有讀者問(wèn):
[^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) 編輯 收藏

評(píng)論

#1樓 2007-03-26 13:16 maple[未注冊(cè)用戶(hù)]

用這個(gè)不也可以么?

((?!abc).)*?
回復(fù) 引用   

#2樓[樓主] 2007-03-26 14:12 deerchao      

@maple
我試了一下,但是((?!abc).)*?好像什么也匹配不到吧?
回復(fù) 引用 查看   

#3樓 2007-03-26 15:54 maple[未注冊(cè)用戶(hù)]

兩頭加上\b
和你的表達(dá)式結(jié)果差不多
不過(guò)要匹配出單個(gè)單詞,還需要修改
回復(fù) 引用   

#4樓 2007-03-26 15:57 maple[未注冊(cè)用戶(hù)]

不好意思,應(yīng)該是
\b((?!abc).)*\b

呵呵,多寫(xiě)了個(gè)問(wèn)號(hào)
回復(fù) 引用   

#5樓 2007-03-26 16:18 maple[未注冊(cè)用戶(hù)]

再試試這個(gè)表達(dá)式吧

\b((?!abc)\S)+?\b

不知道我對(duì)題意的理解對(duì)不對(duì),這個(gè)應(yīng)該可以匹配出不包含abc的單詞,當(dāng)然abc這個(gè)單詞也會(huì)排除
回復(fù) 引用   

#6樓[樓主] 2007-04-02 10:56 deerchao      

不錯(cuò),您的這個(gè)表達(dá)式能達(dá)到同樣的效果,而且更簡(jiǎn)潔。 回復(fù) 引用 查看   

#7樓 2007-04-04 11:43 apple[未注冊(cè)用戶(hù)]

您好,受益匪淺,但是我想匹配3-5個(gè)以字母或數(shù)字開(kāi)頭的字串,其中不包括http,這樣寫(xiě)卻什么也匹配不到,請(qǐng)教??!
/^[a-zA-Z0-9]{3,5}b((?!http)\S)+?$/
回復(fù) 引用   

#8樓[樓主] 2007-04-04 14:17 deerchao      

您的表達(dá)式中間是不是多了一個(gè)b?
如果前面3-5個(gè)字母或數(shù)字也不能包含http,你可以使用:
^((?!http)[a-zA-Z0-9]){3,5}((?!http)\w)*$
如果前面可以包含http你可以使用:
^([a-zA-Z0-9]){3,5}((?!http)\w)*$

注:我是使用.Net的引擎進(jìn)行測(cè)試的,也許在javascript引擎下結(jié)果不同。
回復(fù) 引用 查看   

#9樓 2007-04-04 15:31 apple[未注冊(cè)用戶(hù)]

非常感謝你及時(shí)的回復(fù),.Net的引擎有點(diǎn)不同,呵呵,不行,不過(guò)樓上的朋友給我了一點(diǎn)啟發(fā):\b((?!http)\S)+?\b;但是如何限定長(zhǎng)度呢?? 回復(fù) 引用   

#10樓[樓主] 2007-04-04 15:41 deerchao      

我試了一下,javascript應(yīng)該也可以?。?br>
test.htm
<script>
var valid="abcdefgh";
var invalid="acdsihttp";

var reg=/^((?!http)[a-zA-Z0-9]){3,5}((?!http)\w)*$/ ;
alert(reg.test(valid));
alert(reg.test(invalid));
</script>
回復(fù) 引用 查看   

#11樓 2007-10-22 23:50 Felix      

請(qǐng)教一個(gè)困擾我多次的問(wèn)題,雖然類(lèi)似,但我硬是沒(méi)搞出來(lái)

已知:<[^>]+>可以匹配所有HTML標(biāo)簽,從而通過(guò)替換標(biāo)簽內(nèi)容去掉這些標(biāo)簽形成純粹的文本

但我想在匹配替換時(shí)排除<img /> 和 <a >xxx</a> 這兩個(gè)標(biāo)簽從而讓其在HTML文檔中得到保留,卻不知如何來(lái)寫(xiě),希望能幫我研究研究,不勝感激??!
回復(fù) 引用 查看   

#12樓[樓主] 2007-10-23 02:41 deerchao      

@Felix
<(?!(/?(img|a)\b))[^>]*>

匹 配<html><a href="#">xxx</a><img /> <img></img><div id="aaa">xyz</div></html>的結(jié)果:
<html>
<div id="aaa">
</div>
</html>
回復(fù) 引用 查看   

#13樓 2007-10-23 10:45 Felix      

樓主真是非常的生猛,測(cè)試通過(guò)了,感謝?。?/span> 回復(fù) 引用 查看   

#14樓 2007-10-23 11:41 Felix      

樓主能否加我的MSN或Gtalk有事相商
lf1981##msn、com
Gtalk同理
回復(fù) 引用 查看   

#15樓 2007-11-27 12:58 蜜桃[未注冊(cè)用戶(hù)]

有用!但是看不懂
歡迎來(lái)蜜桃玩
http://www.
回復(fù) 引用   

#16樓 2008-04-19 13:51 sonic_andy[未注冊(cè)用戶(hù)]

([^a]|a[^b]|ab[^c]) 回復(fù) 引用   

#17樓 2008-05-29 10:43 初學(xué)者ZXYLXW[未注冊(cè)用戶(hù)]

如果我想找出字符串中有abc,但排除有@abc的如何做呢?
比如說(shuō)在.NET使用ACCESS"偽儲(chǔ)存過(guò)程"中
我想替換 "abc" = "@abc" 中前面一個(gè)abc為"中文字段名"
變成 "中文字段名" = "@abc" ,請(qǐng)指教!
回復(fù) 引用   

#18樓 2008-08-18 11:54 booker[未注冊(cè)用戶(hù)]

你好博主,我用用vim處理log,現(xiàn)在我想只保留用戶(hù)名是TEMP的log記錄,可是VIM中好像沒(méi)有?!這樣的正則表達(dá)式,我用:
/^.* \(TEMP\)\{0}.*$

結(jié)果無(wú)法匹配,不知道博主有沒(méi)有什么好辦法?謝謝
回復(fù) 引用   

#19樓 2008-09-16 15:36 Yvon[未注冊(cè)用戶(hù)]

正在學(xué)習(xí)中,謝謝指點(diǎn) 回復(fù) 引用   

#20樓 2008-12-29 10:42 fox33333[未注冊(cè)用戶(hù)]

那如果查找
werewre 123 werewr abc789 23342s112
wereww 123 2345fdfd 789 343242sdfd
如要匹配
包含123后跟任意字符 然后包含789 但是不包含連續(xù)的字符abc 這樣如何寫(xiě)呢?
回復(fù) 引用   

#21樓 2009-01-05 23:14 disss[未注冊(cè)用戶(hù)]

請(qǐng)教了

如果想選中不包括abc的行應(yīng)該如何寫(xiě)
回復(fù) 引用   

#22樓 2009-01-05 23:19 disss[未注冊(cè)用戶(hù)]

文本中如何實(shí)現(xiàn)
只保留含有abc或45678的行
回復(fù) 引用   

#23樓 2009-03-25 14:37 regex[未注冊(cè)用戶(hù)]

昨天遇到這樣的頁(yè)面代碼:
<!-- AAAA <!-- BBBB --> CCCC--> DDDD <!-- EEEE -->
想把<!-- -->的東西去掉。怎么寫(xiě)呢?

'<!--((?!(<!--|-->)).)*-->'sm
寫(xiě)了一個(gè),這個(gè)可以處理(需要循環(huán)調(diào)用,一次去一層)。但是當(dāng)匹配內(nèi)容超過(guò)3000字節(jié),就down掉了。。。

今天又遇到
<body><tr><td>不要我<div>抓我吧</div></td></tr></body>

想獲得div,td,body最近一層里面的內(nèi)容
/<(?:td|div|body|style|script)[^>]*>(.*?)/is
結(jié)果一看還是不行,獲得是整個(gè)body感覺(jué)沒(méi)有貪婪成功啊。。他獲得的是body里的全部?jī)?nèi)容。
希望LZ幫忙看看,最好在給我發(fā)個(gè)email。謝啦!
回復(fù) 引用   

#24樓 2009-07-29 11:31 qiufeng[未注冊(cè)用戶(hù)]

樓主
如果是想匹配不包含“//”的字符串呢 ,好像這個(gè)不能個(gè)實(shí)現(xiàn)啊
望樓主指點(diǎn)! 謝謝
回復(fù) 引用   

#25樓 2009-08-08 00:49 Kevin Yang[未注冊(cè)用戶(hù)]

@qiufeng
可以參考我這篇文章,用于日志分析中排除包含特定字符串的條目。
http://www./2009/08/%E4%BD%BF%E7%94%A8%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%89%BE%E5%87%BA%E4%B8%8D%E5%8C%85%E5%90%AB%E7%89%B9%E5%AE%9A%E5%AD%97%E7%AC%A6%E4%B8%B2%E7%9A%84%E6%9D%A1%E7%9B%AE.html


寫(xiě)這篇文章的時(shí)候參考了lz文章中的一些東西。
回復(fù) 引用   

#26樓 2009-09-05 16:30 FeeLiN[未注冊(cè)用戶(hù)]

判斷不包含字符串a(chǎn)bc的很簡(jiǎn)單啊
難的是怎么判斷不等于字符串a(chǎn)bc
回復(fù) 引用   

#27樓 2009-10-15 11:35 amenlv[未注冊(cè)用戶(hù)]

問(wèn)個(gè)問(wèn)題,為啥(\d+):\1 不能匹配11:22?
我想把文本中的時(shí)間找出來(lái),比如10:22:35,但是這個(gè)\1的后向引用似乎沒(méi)有效果啊~~~求解!
回復(fù) 引用   

#28樓 2010-09-26 17:57 slow7777      

!
在樓主翻譯的正則表達(dá)式30分鐘入門(mén)教程里Ctrl+F:abc第一個(gè)就是答案.
樓主你辜負(fù)了我對(duì)你的景仰- -||
回復(fù) 引用 查看   

#29樓 2011-01-23 15:46 alswl      

@slow7777
- -#
啊~居然~
回復(fù) 引用 查看   

#30樓 2011-02-23 15:16 NewSea.      

好文.正找到這. 回復(fù) 引用 查看   

#31樓 2011-04-14 13:30 憂(yōu)憂(yōu)夏天      

試了下這個(gè)\b[^a]*[^b]*[^c]*\b
只要不同時(shí)存在a,b,c就能匹配出來(lái),不知道可以不
回復(fù) 引用 查看   

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多