主頁 > 知識(shí)庫 > 超強(qiáng)變態(tài)的正則(\w)((?=\1\1\1)(\1))+講解

超強(qiáng)變態(tài)的正則(\w)((?=\1\1\1)(\1))+講解

熱門標(biāo)簽:阿里云 科大訊飛語音識(shí)別系統(tǒng) 銀行業(yè)務(wù) Mysql連接數(shù)設(shè)置 電子圍欄 服務(wù)器配置 Linux服務(wù)器 團(tuán)購網(wǎng)站

這個(gè)正則出自這個(gè)網(wǎng)站 http://www.regexlab.com/zh/regref.htm

正向預(yù)搜索:"(?=xxxxx)","(?!xxxxx)"

格式:"(?=xxxxx)",在被匹配的字符串中,它對(duì)所處的 "縫隙" 或者 "兩頭" 附加的條件是:所在縫隙的右側(cè),必須能夠匹配上 xxxxx 這部分的表達(dá)式。因?yàn)樗皇窃诖俗鳛檫@個(gè)縫隙上附加的條件,所以它并不影響后邊的表達(dá)式去真正匹配這個(gè)縫隙之后的字符。這就類似 "\b",本身不匹配任何字符。"\b" 只是將所在縫隙之前、之后的字符取來進(jìn)行了一下判斷,不會(huì)影響后邊的表達(dá)式來真正的匹配。

點(diǎn)擊測(cè)試 舉例1:表達(dá)式 "Windows (?=NT|XP)" 在匹配 "Windows 98, Windows NT, Windows 2000" 時(shí),將只匹配 "Windows NT" 中的 "Windows ",其他的 "Windows " 字樣則不被匹配。

點(diǎn)擊測(cè)試 舉例2:表達(dá)式 "(\w)((?=\1\1\1)(\1))+" 在匹配字符串 "aaa ffffff 999999999" 時(shí),將可以匹配6個(gè)"f"的前4個(gè),可以匹配9個(gè)"9"的前7個(gè)。這個(gè)表達(dá)式可以讀解成:重復(fù)4次以上的字母數(shù)字,則匹配其剩下最后2位之前的部分。當(dāng)然,這個(gè)表達(dá)式可以不這樣寫,在此的目的是作為演示之用。

例子:例如 999999999 或 666666

1、(\w)((?=\1\1\1)(\1))+

最后的+號(hào)意思是一個(gè)或多個(gè) 意思就是 666666之匹配前四個(gè)6,而999999999只匹配前面7個(gè),后面反正要留兩個(gè)
因?yàn)橛昧??=\1\1),每次只匹配兩個(gè),但保證右側(cè)有99,每次都取兩個(gè),每次都包括之前的一個(gè)

(\w)((?=\1\1\1)(\1))+在999999999 中實(shí)際上是被匹配了6次。
第一次:(\w)取出第一個(gè)9,(?=\1\1\1)限定第2個(gè)9到第4個(gè)9,(\1)取出第2個(gè)9,得到99
第二次:(?=\1\1\1)限定第3個(gè)9到第5個(gè)9,(\1)取出第3個(gè)9,得到999
第三次:(?=\1\1\1)限定第4個(gè)9到第6個(gè)9,(\1)取出第4個(gè)9,得到9999
第四次:(?=\1\1\1)限定第5個(gè)9到第7個(gè)9,(\1)取出第5個(gè)9,得到99999
第五次:(?=\1\1\1)限定第6個(gè)9到第8個(gè)9,(\1)取出第6個(gè)9,得到999999
第六次:(?=\1\1\1)限定第7個(gè)9到第9個(gè)9,(\1)取出第7個(gè)9,得到9999999

2、(\w)((\1)(?=\1\1))+

第一次 \w取出第一個(gè)9,\1再取1個(gè)9就是 99 后面緊跟兩個(gè)9才符合條件 所有第一次就是99
第二次 從第3個(gè)9到第四個(gè)9, 開始就\1 再取一個(gè) 999
第三次 匹配從第4-6個(gè)9   取一個(gè) 9999
第四次 從第5-7個(gè)9取一個(gè) 取一個(gè)99999
第五次 從第6-8個(gè)9 取一個(gè) 是  999999
第六次 從第7-9個(gè)9 后面仍滿足取一個(gè)是 9999999
第七次  第8個(gè)開始右側(cè)已經(jīng)不夠三個(gè)9了,所有取消匹配,匹配之前的7個(gè)9

3、 (?=(\w+)>).*(?=\/\1>)

詳細(xì)解釋下:?=和?=都表示零寬斷言,一個(gè)匹配后面一個(gè)匹配前面,
對(duì)應(yīng)到上面的例子中,亦即.*前面必須要有(\w+)>,后面必須要有\(zhòng)/\1>。
零寬斷言不體現(xiàn)到最終的匹配結(jié)果中。
再細(xì)看下,(\w+)>匹配tag>類型,\w表示數(shù)字、字母、下劃線;\/\1>中\(zhòng)/匹配斜杠/,
\1表示捕獲組,亦即從正則表達(dá)式左邊開始的第一個(gè)小括號(hào)中的內(nèi)容,注意這里不包含零寬斷言的括號(hào),在上例中表示(\w+)中的部分。
中間的.*表示任意多個(gè)非換行符。

總結(jié)下:匹配類似tag>content/tag>格式中的content部分

不過經(jīng)過測(cè)試網(wǎng)頁版的js匹配不到,還是Regex Match Tracer中比較好用,推薦大家下載學(xué)習(xí)

網(wǎng)頁版看不到效果

用軟件就可以

所有大家在使用的時(shí)候,要測(cè)試你的語言是否支持。

正則表達(dá)式看懂的最好方法就是一步步分開解析:

1)以 '.*' 為分界,前面括號(hào)中的內(nèi)容可以劃分為  ‘?=' 和 ‘(\w+)>',其中‘(\w+)>'表示匹配尖括號(hào)里面是字母、數(shù)字或下劃線的內(nèi)容,類似span>,外面還要加個(gè)括號(hào)是要實(shí)現(xiàn)分組;而‘?='用到的是零寬斷言語法,表示的是斷定‘(\w+)>'后面有或沒有內(nèi)容,而且與內(nèi)容的間隔寬度為零。
2)再看' .* '后面的部分,括號(hào)里面的內(nèi)容可以分為 ‘?=' 和 ‘(\/\1>',其中‘?='用零寬斷言表示匹配‘(\/\1>'前面的部分,而對(duì)于‘(\/\1>',‘\/'匹配‘/'符號(hào),類似/span>,這里可能有些同學(xué)不太明白‘\1'是什么意思?這里用到的是捕獲分組的思想,上述提到的‘(\w+)>'外面加個(gè)小括號(hào)就表示一個(gè)分組,對(duì)于正則表達(dá)式的分組結(jié)果,索引 0表示匹配的整個(gè)內(nèi)容,而1表示的是第1個(gè)子分組,所以這里的'\1'指向的就是前面的第一個(gè)分組‘(\w+)>',\2表示重復(fù)第2個(gè)子項(xiàng),\n表示重復(fù)第n個(gè)子項(xiàng);
3).* 就比較簡(jiǎn)單了,表示的是匹配 除了換行符意外的任意字符0次或多次。
綜上,改表達(dá)式匹配的是類似html標(biāo)簽這種內(nèi)容的,如body>你好,正則!/body>

下面是腳本之家小編寫的打算將不帶style的span替換為空的正則。

str=str.replace(/span\s*?(?!:style)>(.[^>]*)\/span>/ig,"$1");

不可能用的,要不所有的內(nèi)容都亂了。

文中相關(guān)測(cè)試工具

JavaScript正則表達(dá)式在線測(cè)試工具

Regex Match Tracer

下面接這個(gè)為大家分享這幾個(gè)高級(jí)規(guī)則

預(yù)搜索,不匹配;反向預(yù)搜索,不匹配
前面的章節(jié)中,我講到了幾個(gè)代表抽象意義的特殊符號(hào):"^","$","\b"。它們都有一個(gè)共同點(diǎn),那就是:它們本身不匹配任何字符,只是對(duì) "字符串的兩頭" 或者 "字符之間的縫隙" 附加了一個(gè)條件。理解到這個(gè)概念以后,本節(jié)將繼續(xù)介紹另外一種對(duì) "兩頭" 或者 "縫隙" 附加條件的,更加靈活的表示方法。

正向預(yù)搜索:"(?=xxxxx)","(?!xxxxx)"

格式:"(?=xxxxx)",在被匹配的字符串中,它對(duì)所處的 "縫隙" 或者 "兩頭" 附加的條件是:所在縫隙的右側(cè),必須能夠匹配上 xxxxx 這部分的表達(dá)式。因?yàn)樗皇窃诖俗鳛檫@個(gè)縫隙上附加的條件,所以它并不影響后邊的表達(dá)式去真正匹配這個(gè)縫隙之后的字符。這就類似 "\b",本身不匹配任何字符。"\b" 只是將所在縫隙之前、之后的字符取來進(jìn)行了一下判斷,不會(huì)影響后邊的表達(dá)式來真正的匹配。

點(diǎn)擊測(cè)試 舉例1:表達(dá)式 "Windows (?=NT|XP)" 在匹配 "Windows 98, Windows NT, Windows 2000" 時(shí),將只匹配 "Windows NT" 中的 "Windows ",其他的 "Windows " 字樣則不被匹配。

點(diǎn)擊測(cè)試 舉例2:表達(dá)式 "(\w)((?=\1\1\1)(\1))+" 在匹配字符串 "aaa ffffff 999999999" 時(shí),將可以匹配6個(gè)"f"的前4個(gè),可以匹配9個(gè)"9"的前7個(gè)。這個(gè)表達(dá)式可以讀解成:重復(fù)4次以上的字母數(shù)字,則匹配其剩下最后2位之前的部分。當(dāng)然,這個(gè)表達(dá)式可以不這樣寫,在此的目的是作為演示之用。

格式:"(?!xxxxx)",所在縫隙的右側(cè),必須不能匹配 xxxxx 這部分表達(dá)式。

點(diǎn)擊測(cè)試 舉例3:表達(dá)式 "((?!\bstop\b).)+" 在匹配 "fdjka ljfdl stop fjdsla fdj" 時(shí),將從頭一直匹配到 "stop" 之前的位置,如果字符串中沒有 "stop",則匹配整個(gè)字符串。

點(diǎn)擊測(cè)試 舉例4:表達(dá)式 "do(?!\w)" 在匹配字符串 "done, do, dog" 時(shí),只能匹配 "do"。在本條舉例中,"do" 后邊使用 "(?!\w)" 和使用 "\b" 效果是一樣的。

反向預(yù)搜索:"(?=xxxxx)","(?!xxxxx)"

這兩種格式的概念和正向預(yù)搜索是類似的,反向預(yù)搜索要求的條件是:所在縫隙的 "左側(cè)",兩種格式分別要求必須能夠匹配和必須不能夠匹配指定表達(dá)式,而不是去判斷右側(cè)。與 "正向預(yù)搜索" 一樣的是:它們都是對(duì)所在縫隙的一種附加條件,本身都不匹配任何字符。

舉例5:表達(dá)式 "(?=\d{4})\d+(?=\d{4})" 在匹配 "1234567890123456" 時(shí),將匹配除了前4個(gè)數(shù)字和后4個(gè)數(shù)字之外的中間8個(gè)數(shù)字。由于 JScript.RegExp 不支持反向預(yù)搜索,因此,本條舉例不能夠進(jìn)行演示。很多其他的引擎可以支持反向預(yù)搜索,比如:Java 1.4 以上的 java.util.regex 包,.NET 中System.Text.RegularExpressions 命名空間,以及本站推薦的最簡(jiǎn)單易用的 DEELX 正則引擎。

到此這篇關(guān)于超強(qiáng)變態(tài)的正則(\w)((?=\1\1\1)(\1))+講解的文章就介紹到這了,更多相關(guān)正則表達(dá)式高級(jí)規(guī)則內(nèi)容請(qǐng)搜素腳本之家以前的文章或下面相關(guān)文章,希望大家以后多多支持腳本之家!

標(biāo)簽:衡水 江蘇 蚌埠 廣元 棗莊 大理 萍鄉(xiāng) 衢州

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《超強(qiáng)變態(tài)的正則(\w)((?=\1\1\1)(\1))+講解》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266