亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Regex > 正文

正則表達式零寬斷言詳解

2020-03-16 20:57:55
字體:
來源:轉載
供稿:網友

零寬斷言是正則表達式中的一種方法,正則表達式在計算機科學中,是指一個用來描述或者匹配一系列符合某個句法規則的字符串的單個字符串。

定義解釋

零寬斷言是正則表達式中的一種方法
正則表達式在計算機科學中,是指一個用來描述或者匹配一系列符合某個句法規則的字符串的單個字符串。在很多文本編輯器或其他工具里,正則表達式通常被用來檢索和/或替換那些符合某個模式的文本內容。許多程序設計語言都支持利用正則表達式進行字符串操作。例如,在Perl中就內建了一個功能強大的正則表達式引擎。正則表達式這個概念最初是由Unix中的工具軟件(例如sed和grep)普及開的。正則表達式通常縮寫成“regex”,單數有regexp、regex,復數有regexps、regexes、regexen。

零寬斷言

用于查找在某些內容(但并不包括這些內容)之前或之后的東西,也就是說它們像/b,^,$那樣用于指定一個位置,這個位置應該滿足一定的條件(即斷言),因此它們也被稱為零寬斷言。最好還是拿例子來說明吧: 斷言用來聲明一個應該為真的事實。正則表達式中只有當斷言為真時才會繼續進行匹配。

(?=exp)也叫零寬度正預測先行斷言,它斷言自身出現的位置的后面能匹配表達式exp。比如/b(?=re)/w+/b,匹配以re開頭的單詞的后面部分(除了re以外的部分),如查找reading a book.時,它會匹配ading。

var reg = new Regex(@"/w+(?=ing)");var str = "muing";Console.WriteLine(reg.Match(str).Value);//返回mu

(?<=exp)也叫零寬度正回顧后發斷言,它斷言自身出現的位置的前面能匹配表達式exp。比如/b/w+(?<=ing/b)會匹配以ing結尾的單詞的前半部分(除了ing以外的部分),例如在查找I am reading.時,它匹配read。

假如你想要給一個很長的數字中每三位間加一個逗號(當然是從右邊加起了),你可以這樣查找需要在前面和里面添加逗號的部分:((?=/d)/d{3})+/b,用它對1234567890進行查找時結果是234567890。
下面這個例子同時使用了這兩種斷言:(?<=/s)/d+(?=/s)匹配以空白符間隔的數字(再次強調,不包括這些空白符)。

負向零寬斷言

前面我們提到過怎么查找不是某個字符或不在某個字符類里的字符的方法(反義)。但是如果我們只是想要確保某個字符沒有出現,但并不想去匹配它時怎么辦?例如,如果我們想查找這樣的單詞--它里面出現了字母q,但是q后面跟的不是字母u,我們可以嘗試這樣:

/b/w*q[^u]/w*/b匹配包含后面不是字母u的字母q的單詞。但是如果多做測試(或者你思維足夠敏銳,直接就觀察出來了),你會發現,如果q出現在單詞的結尾的話,像Iraq,Benq,這個表達式就會出錯。這是因為[^u]總要匹配一個字符,所以如果q是單詞的最后一個字符的話,后面的[^u]將會匹配q后面的單詞分隔符(可能是空格,或者是句號或其它的什么),后面的/w*/b將會匹配下一個單詞,于是/b/w*q[^u]/w*/b就能匹配整個Iraq fighting。負向零寬斷言能解決這樣的問題,因為它只匹配一個位置,并不消費任何字符。現在,我們可以這樣來解決這個問題:/b/w*q(?!u)/w*/b。

零寬度負預測先行斷言(?!exp),斷言此位置的后面不能匹配表達式exp。例如:/d{3}(?!/d)匹配三位數字,而且這三位數字的后面不能是數字;/b((?!abc)/w)+/b匹配不包含連續字符串abc的單詞。
同理,我們可以用(?<!exp),零寬度負回顧后發斷言來斷言此位置的前面不能匹配表達式exp:(?<![a-z])/d{7}匹配前面不是小寫字母的七位數字。

一個更復雜的例子:(?<=<(/w+)>).*(?=<///1>)匹配不包含屬性的簡單HTML標簽內里的內容。(<?=(/w+)>)指定了這樣的前綴:被尖括號括起來的單詞(比如可能是<b>),然后是.*(任意的字符串),最后是一個后綴(?=<///1>)。注意后綴里的//,它用到了前面提過的字符轉義;/1則是一個反向引用,引用的正是捕獲的第一組,前面的(/w+)匹配的內容,這樣如果前綴實際上是<b>的話,后綴就是</b>了。整個表達式匹配的是<b>和</b>之間的內容(再次提醒,不包括前綴和后綴本身)。

 

上面的看了有點傷腦筋啊。下面來點補充一

斷言用來聲明一個應該為真的事實。正則表達式中只有當斷言為真時才會繼續進行匹配。
接下來的四個用于查找在某些內容(但并不包括這些內容)之前或之后的東西,也就是說它們像/b,^,$那樣用于指定一個位置,這個位置應該滿足一定的條件(即斷言),因此它們也被稱為零寬斷言。最好還是拿例子來說明吧:

(?=exp)也叫零寬度正預測先行斷言,它斷言自身出現的位置的后面能匹配表達式exp。比如/b/w+(?=ing/b),匹配以ing結尾的單詞的前面部分(除了ing以外的部分),如查找I'm singing while you're dancing.時,它會匹配sing和danc。
(?<=exp)也叫零寬度正回顧后發斷言,它斷言自身出現的位置的前面能匹配表達式exp。比如(?<=/bre)/w+/b會匹配以re開頭的單詞的后半部分(除了re以外的部分),例如在查找reading a book時,它匹配ading。

假如你想要給一個很長的數字中每三位間加一個逗號(當然是從右邊加起了),你可以這樣查找需要在前面和里面添加逗號的部分:((?<=/d)/d{3})*/b,用它對1234567890進行查找時結果是234567890。
下面這個例子同時使用了這兩種斷言:(?<=/s)/d+(?=/s)匹配以空白符間隔的數字(再次強調,不包括這些空白符)。

補充二:

最近為了對html文件進行源碼處理,需要進行正則查找并替換。于是借著這個機會把正則系統地學一下,雖然以前也用過正則,但每次都是臨時學一下混過關的。在學習的過程中還是遇到不少問題的,特別是零寬斷言(這里還要吐槽下,網上到處都是都復制粘貼的內容,遇到個問題查看了不少重復的東西,汗?。。。?,所以在這里把自己的理解寫下來,方便以后查閱!

      零寬度正預測先行斷言是什么呢,看msdn上的官方解釋定義

(?= 子表達式)

(零寬度正預測先行斷言。)僅當子表達式在此位置的右側匹配時才繼續匹配。例如,/w+(?=/d) 與后跟數字的單詞匹配,而不與該數字匹配。

      經典的例子:某單詞以ing結尾,要獲取ing前面的內容

var reg = new Regex(@"/w+(?=ing)");var str = "muing";Console.WriteLine(reg.Match(str).Value);//返回mu

      以上是網上到處可見的例子,到這里或許你明白了,原來就是返回了exp表達式前面的內容。

     再看下面的的代碼

var reg = new Regex(@"a(?=b)c");var str = "abc";Console.WriteLine(reg.IsMatch(str));//返回false

      為什么會返回false?

     其實msdn官方定義已經說了,只是它說得很官方而已。這里需要我們注意一個關鍵點:此位置。沒錯,是位置而不是字符。那么結合官方定義和第一個例子來理解第二個例子:

     因為a后面是b,則此時返回了匹配內容a(由第一個例子知道,只返回a不返回exp匹配的內容),此時a(?=b)c中的a(?=b)部分已經解決了,接下來要解決c的匹配問題了,此時匹配c要從字符串abc哪里開始呢,結合官方定義,就知道是從子表達的位置向右開始的,那么就是從b的位置開始,但b又不匹配a(?=b)c剩余部分的c,所以abc就不匹配a(?=b)c了。

     那么如果要上面的進行匹配,正則應該如何寫呢?

     答案是:a(?=b)bc

     當然,有人會說直接abc就匹配上了,還要這么折騰嗎?當然不用這么折騰,只是為了說明零寬度正預測先行斷言到底是怎么一回事?關于其它的零寬斷言也是同一原理!

補充三

(?=exp):零寬度正預測先行斷言,它斷言自身出現的位置的后面能匹配表達式exp。

#匹配后面為_path,結果為product
  'product_path'.scan /(product)(?=_path)/

(?<=exp):零寬度正回顧后發斷言,它斷言自身出現的位置的前面能匹配表達式exp

#匹配前面為name:,結果為wangfei
'name:wangfei'.scan /(?<=name:)(wangfei)/ #wangfei

(?!exp):零寬度負預測先行斷言,斷言此位置的后面不能匹配表達式exp。

#匹配后面不是_path
'product_path'.scan /(product)(?!_path)/  #nil
#匹配后面不是_url
'product_path'.scan /(product)(?!_url)/  #product

(?<!exp):零寬度負回顧后發斷言來斷言此位置的前面不能匹配表達式exp

#匹配前面不是name:
'name:angelica'.scan /(?<!name:)(angelica)/  #nil
#匹配前面不是nick_name:
'name:angelica'.scan /(?<!nick_name:)(angelica)/#angelica

小編也受夠了這個東西,等有好的東西再分享,今天洗洗睡吧

 

注:相關教程知識閱讀請移步到正則表達式頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91成人在线视频| 亲爱的老师9免费观看全集电视剧| 日韩av在线电影网| 国产成人在线视频| 欧美在线中文字幕| 福利精品视频在线| 精品夜色国产国偷在线| 欧美成人精品在线播放| 欧美一区二区三区……| 成人一区二区电影| 久久777国产线看观看精品| 国产视频一区在线| 狠狠躁夜夜躁人人爽超碰91| 日韩精品日韩在线观看| 蜜臀久久99精品久久久无需会员| 国产aaa精品| 亚洲成人a级网| 成人激情电影一区二区| 亚洲久久久久久久久久| 久久亚洲成人精品| 国产精品欧美激情在线播放| 国产成人综合精品在线| 久久免费国产视频| 亚州精品天堂中文字幕| 国产精品久久久久久久久久久久久久| 色妞在线综合亚洲欧美| 亚洲自拍在线观看| 日韩精品视频在线观看网址| 亚洲二区中文字幕| 91福利视频在线观看| 亚洲在线免费观看| 亚洲国产精品va在线看黑人动漫| 欧美精品videos| 亚洲视频精品在线| 亚洲一区二区福利| 8x拔播拔播x8国产精品| 91国内免费在线视频| 亚洲免费成人av电影| 精品爽片免费看久久| 国产精品久久久久免费a∨| 81精品国产乱码久久久久久| 日韩高清免费在线| 久久精品视频亚洲| 中文字幕日韩av综合精品| 日韩免费观看av| 精品少妇一区二区30p| 超碰精品一区二区三区乱码| 久久亚洲成人精品| 成人做爰www免费看视频网站| 欧美有码在线观看| 日韩中文字幕在线观看| …久久精品99久久香蕉国产| 色综合亚洲精品激情狠狠| 亚洲电影免费观看高清| 色一区av在线| 亚洲free性xxxx护士hd| 欧美激情欧美激情| 国产精品三级美女白浆呻吟| 欧美日韩一区二区精品| 91在线观看免费高清完整版在线观看| 欧美日韩国产999| 欧美电影在线观看高清| 日韩一二三在线视频播| 亚洲美女视频网站| 蜜臀久久99精品久久久无需会员| www.xxxx精品| 自拍偷拍亚洲一区| 亚洲第一色在线| 日韩电影免费在线观看中文字幕| 北条麻妃在线一区二区| 亚洲人精选亚洲人成在线| 欧美激情久久久| 国产精品久久久久久久久久久久| 欧美老肥婆性猛交视频| 亚洲欧洲一区二区三区久久| 伊人久久综合97精品| 亚洲国产一区二区三区四区| 日韩av日韩在线观看| 国产黑人绿帽在线第一区| 美女视频久久黄| 日韩在线不卡视频| 麻豆国产精品va在线观看不卡| 久久精品99久久久久久久久| 国产精品精品久久久久久| 欧美激情精品久久久久久变态| 国产极品精品在线观看| 久久精品99久久久久久久久| 亚洲成avwww人| 国产精品aaaa| 北条麻妃一区二区在线观看| 亚洲大胆人体av| 国产精品久久久久免费a∨| 亚洲一区二区三区在线免费观看| 久久综合久久八八| 日韩在线播放一区| 欧美与黑人午夜性猛交久久久| 亚洲天堂男人天堂女人天堂| 97免费视频在线播放| 欧美激情视频在线观看| 欧美日韩免费网站| 91社影院在线观看| 国产日韩综合一区二区性色av| 亚洲精品久久久久国产| 91精品在线影院| 在线观看91久久久久久| 在线国产精品播放| 38少妇精品导航| 一本色道久久88精品综合| 精品国偷自产在线视频99| 欧美激情一二三| 亚洲淫片在线视频| 国产欧美 在线欧美| 久久中文字幕视频| 日韩av电影在线网| 国产精品旅馆在线| 高清欧美性猛交xxxx黑人猛交| 欧美激情极品视频| 国产精品69精品一区二区三区| 另类视频在线观看| 欧美成人网在线| 成人xxxxx| 成人国产在线激情| 青青久久av北条麻妃海外网| 在线国产精品播放| 欧美中文字幕在线观看| 国内成人精品一区| 亚洲人成在线观看| 国产精品久久久久久超碰| 亚洲精品美女久久久| 欧美激情图片区| 国产福利成人在线| 国产精品亚洲美女av网站| 国产日韩综合一区二区性色av| 日韩一区二区三区国产| 日韩欧美在线网址| 亚洲美女av黄| 中文字幕在线看视频国产欧美在线看完整| 亚洲肉体裸体xxxx137| 国产亚洲精品美女| 亚洲第一区在线| 色午夜这里只有精品| 隔壁老王国产在线精品| 精品露脸国产偷人在视频| 欧美日韩在线看| 亚洲精品美女久久久| 亚洲男人的天堂网站| 亚洲大胆人体在线| 国产亚洲精品久久久久久777| 亚洲电影免费观看| 日本成人精品在线| 欧美成人亚洲成人| 欧美精品免费在线| 久久精品一偷一偷国产| 国产成人短视频| 亚洲激情在线观看视频免费| 亚洲va欧美va国产综合久久| 欧美一级淫片aaaaaaa视频| 国产噜噜噜噜噜久久久久久久久| 欧美理论电影在线播放| 亚洲精品电影网站| 亚洲欧洲在线观看| 色偷偷av亚洲男人的天堂| 欧美一级片在线播放| 亚洲精品电影久久久|