欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品

主頁 > 知識庫 > 正則表達式——詳細講解平衡組

正則表達式——詳細講解平衡組

熱門標簽:甘肅醫(yī)療外呼系統(tǒng)排名 外呼系統(tǒng)無呼出路由是什么原因 西藏智能外呼系統(tǒng)代理商 400電話辦理電話辦理 梅縣地圖標注 呼叫系統(tǒng)外呼只能兩次 貴港公司如何申請400電話 ai電話機器人搭建 地圖標注教學點

這篇文章適合你嗎?

要讀懂這篇文章的精髓,你最好要有一點正則匹配原理的基礎。比如".*?"匹配文本內容"asp163",稍懂正則表達式的人都知道可以匹配,但是你知道他的匹配過程嗎?如果你不太清楚,那么下面的內容,對你來說可能不太適合,或許,看的太吃力且無法領悟平衡組的用法。因此,我建議你先了解正則表達式NFA引擎的匹配原理。想要整理一份易懂易描述的話,的確要費些時間,但不知道這篇內容會不會達到我預期的效果。慢慢完善吧~(注:這是我2010年寫的,現在拿過來,有時間將自己做為讀者來看本篇文章,修改有問題的地方,并增加些實例,盡量做到通俗易懂。)

一般正則教程中對平衡組的介紹

如果想要匹配可嵌套的層次性結構的話,就得使用平衡組了。舉個例子吧,如何把“xx aa bbb> bbb> aa> yy”這樣的字符串里,最長的尖括號內的內容捕獲出來?

這里需要用到以下的語法構造:
(?group>) 把捕獲的內容命名為group,并壓入堆棧
(?-group>) 從堆棧上彈出最后壓入堆棧的名為group的捕獲內容,如果堆棧本來為空,則本分組的匹配失敗
(?(group)yes|no) 如果堆棧上存在以名為group的捕獲內容的話,繼續(xù)匹配yes部分的表達式,否則繼續(xù)匹配no部分
(?!) 順序否定環(huán)視,由于沒有后綴表達式,試圖匹配總是失敗

如果你不是一個程序員(或者你是一個對堆棧的概念不熟的程序員),你就這樣理解上面的三種語法吧:第一個就是在黑板上寫一個(或再寫一個)"group",第二個就是從黑板上擦掉一個"group",第三個就是看黑板上寫的還有沒有"group",如果有就繼續(xù)匹配yes部分,否則就匹配no部分。
我們需要做的是每碰到了左括號,就在黑板上寫一個"group",每碰到一個右括號,就擦掉一個,到了最后就看看黑板上還有沒有-如果有那就證明左括號比右括號多,那匹配就應該失?。榱四芸吹酶宄稽c,我用了(?'group')的語法):

         #最外層的左括號
 [^>]*     #最外層的左括號后面的不是括號的內容
 (
  (
   (?'Open') #碰到了左括號,在黑板上寫一個"Open"
   [^>>]*   #匹配左括號后面的不是括號的內容
  )+
  (
   (?'-Open'>) #碰到了右括號,擦掉一個"Open"
   [^>]*   #匹配右括號后面不是括號的內容
  )+
 )*
 (?(Open)(?!))  #在遇到最外層的右括號前面,判斷黑板上還有沒有沒擦掉的"Open";如果有,則匹配失敗
>         #最外層的右括號

我為什么寫這篇文章

看了上面的介紹,你明白了嗎?在我未理解正則表達式匹配原理之前,看上面對于平衡組的介紹,似懂非懂,且只能當做模板記住,而不能靈活運用。因此查閱大量有關正則方面的資料,這里尤其感謝lxcnn的技術文檔及《精通正則表達式》這本書,讓我對正則表達式有了更深入、更系統(tǒng)的理解,因此,在它們的基礎之上,我就結合自己的學習經歷做個小結,一來做為學習筆記存檔,另外,如果能解決你的疑惑,也是件讓人高興的事。
我先暫不分析上面的代碼,先講解一下關于平衡組相關的概念及知識。
下面表達式匹配測試工具為:Expresso,本站也提供它的完美破解版下載。

平衡組的概念及作用

平衡組,故名思義,平衡即對稱,主要是結合幾種正則語法規(guī)則,提供對配對出現的嵌套結構的匹配。平衡組有狹義與廣義兩種定義,狹義平衡組指(?Expression) 語法,而廣義平衡組并不是固定的語法規(guī)則,而是幾種語法規(guī)則的綜合運用,我們平時所說的平衡組通常指的是廣義平衡組。本文中如無特殊說明,平衡組這種簡寫指的是廣義平衡組。
平衡組的匹配原理
平衡組的匹配原理可以用堆棧來解釋,先舉個例子,再根據例子進行解釋。

源字符串:a+(b*(c+d))/e+f-(g/(h-i))*j
正則表達式:((?Open>\()|(?−Open>)|[^()])*(?(Open)(?!))\)
需求說明:匹配成對出現的()中的內容
輸出:(b*(c+d)) 和 (g/(h-i))
我將上面正則表達式代碼分行寫,并加上注釋,這樣看起來有層次,而且方便

 \(        #普通字符“(”
  (       #分組構造,用來限定量詞“*”修飾范圍
   (?Open>\() #命名捕獲組,遇到開括弧“Open”計數加1
   |      #分支結構
   (?-Open>\)) #狹義平衡組,遇到閉括弧“Open”計數減1
   |      #分支結構
   [^()]+    #非括弧的其它任意字符
  )*       #以上子串出現0次或任意多次
  (?(Open)(?!)) #判斷是否還有“Open”,有則說明不配對,什么都不匹配
 \)       #普通閉括弧

對于一個嵌套結構而言,開始和結束標記都是確定的,對于本例開始為“(”,結束為“)”,那么接下來就是考察中間的結構,中間的字符可以劃分為三類,一類是“(”,一類是“)”,其余的就是除這兩個字符以外的任意字符。

那么平衡組的匹配原理就是這樣的

1、先找到第一個“(”,作為匹配的開始。即上面的第1行,匹配了:a+(b*(c+d))/e+f-(g/(h-i))*j (紅色顯示部分)

2、在第1步以后,每匹配到一個“(”,就入棧一個Open捕獲組,計數加1

3、在第1步以后,每匹配到一個“)”,就出棧最近入棧的Open捕獲組,計數減1

也就是講,上面的第一行正則“\(”匹配了:a+(b*(c+d))/e+f-(g/(h-i))*j (紅色顯示部分)
然后,匹配到c前面的“(”,此時,計數加1;繼續(xù)匹配,匹配到d后面的“)”,計算減1;——注意嘍:此時堆棧中的計數是0,正則還是會向前繼續(xù)匹配的,但是,如果匹配到“)”的話,比如,這個例子中d))(紅色顯示的括號)——引擎此時將控制權交給(?(Open)(?!)),判斷堆棧中是否為0,如果為0,則執(zhí)行匹配“no”分支,由于這個條件判斷結構中沒有“no”分支,所以什么都不做,把控制權交給接下來的“\)”
這個正則表達式“\)”可匹配接下來的),即b))(紅色顯示的括號)

4、后面的 (?(Open)(?!))用來保證堆棧中Open捕獲組計數是否為0,也就是“(”和“)”是配對出現的

5、最后的“)”,作為匹配的結束

匹配過程

首先匹配第一個“(”,然后一直匹配,直到出現以下兩種情況之一時,把控制權交給(?(Open)(?!)):
a)堆棧中Open計數已為0,此時再遇到“)”
b)匹配到字符串結束符
這時控制權交給(?(Open)(?!)),判斷Open是否有匹配,由于此時計數為0,沒有匹配,那么就匹配“no”分支,由于這個條件判斷結構中沒有“no”分支,所以什么都不做,把控制權交給接下來的“\)”
如果上面遇到的是情況a),那么此時“\)”可以匹配接下來的“)”,匹配成功;
如果上面遇到的是情況b),那么此時會進行回溯,直到“\)”匹配成功為止,否則報告整個表達式匹配失敗。
由于.NET中的狹義平衡組“(?Close-Open>Expression)”結構,可以動態(tài)的對堆棧中捕獲組進行計數,匹配到一個開始標記,入棧,計數加1,匹配到一個結束標記,出棧,計數減1,最后再判斷堆棧中是否還有Open,有則說明開始和結束標記不配對出現,不匹配,進行回溯或報告匹配失??;如果沒有,則說明開始和結束標記配對出現,繼續(xù)進行后面子表達式的匹配。
需要對“(?!)”進行一下說明,它屬于順序否定環(huán)視,完整的語法是“(?!Expression)”。由于這里的“Expression”不存在,表示這里不是一個位置,所以試圖嘗試匹配總是失敗的,作用就是在Open不配對出現時,報告匹配失敗。

下面在看個例子:

table>
tr>
td id="td1"> /td>
td id="td2">
table>
tr>
td>snhame/td>
td>f/td>
/tr>
/table>
/td>
td>/td>
/tr> /table>

以上為部分的HTML代碼.現在我們的問題是要提取出其td id="td2">的td>標簽并將其刪除掉,以往我們慣用的方法都是直接去取,像td\s*id="td2">[\s\S]+?\/td>,不過問題出來了,我們提取到的不是我們想要的內容,而是

td id="td2">
table>
tr>
td>snhame/td>

原因也很簡單,它和離他最近的/td>標簽匹配上了,不過它不知道這個標簽不是它的-_-,是不是就是?符號的原因呢,我們去掉讓他無限制貪婪,可這下問題更大了,什么亂七八糟的東東它都匹配到了

td id="td2">
table>
tr>
td>snhame/td>
td>f/td>
/tr>
/td>
td>/td>

這個結果也不是我們想要的。那么我就用“平衡組”來解決吧。

td\s*id="td2"[^>]*>((?mm>td[^>]*>)+|(?-mm>/td>)|[\s\S])*?(?(mm)(?!))/td>

匹配的結果是

td id="td2">
table>
tr>
td>snhame/td>
td>f/td>
/tr>
/table>
/td>
td>/td>

這正是我們想要的
注意,我開始寫成這樣的方式

td\s*id="td2"[^>]*>((?mm>td[^>]*>)+|(?-mm>/td>)|[\s\S])*(?(mm)(?!))/td> 

匹配的結果是

td id="td2">
table>
tr>
td>snhame/td>
td>f/td>
/tr>
/table>
/td>
td>/td>

一個問題
以下代碼只是做為一個問題探討
文本內容:e+f(-(g/(h-i))*j

正則表達式:

\(
 (
  (?mm>\()
  |
  (?-mm>\))
  |
  .
 )*?
 (?(mm)(?!))
\)

匹配的結果是:(-(g/(h-i))

標簽:泰安 本溪 常州 涼山 湖州 大興安嶺 哈密

巨人網絡通訊聲明:本文標題《正則表達式——詳細講解平衡組》,本文關鍵詞  正則,表達式,詳細,講解,;如發(fā)現本文內容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內容系統(tǒng)采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《正則表達式——詳細講解平衡組》相關的同類信息!
  • 本頁收集關于正則表達式——詳細講解平衡組的相關信息資訊供網民參考!
  • 推薦文章
    欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品
  • <rt id="w000q"><acronym id="w000q"></acronym></rt>
  • <abbr id="w000q"></abbr>
    <rt id="w000q"></rt>
    福利电影一区二区三区| 性猛交ⅹxxx富婆video| 国产又爽又黄网站| 国产精品美女久久久久av爽李琼| 中文字幕精品综合| 亚洲高清免费观看| 亚洲最大视频网| 欧美日韩午夜影院| 亚洲国产精品一区二区尤物区| 国产在线一区二区综合免费视频| 91免费视频网址| 色婷婷国产精品久久包臀 | 逼特逼视频在线观看| 色老汉一区二区三区| 国产精品久久久久久久浪潮网站 | 国产美女免费网站| 日韩欧美在线影院| 美女视频网站久久| 日韩免费成人av| 国产亚洲女人久久久久毛片| 国产麻豆精品视频| 免费在线观看h片| 亚洲美女免费在线| 亚洲成a人片在线www| 欧美精品自拍偷拍动漫精品| 日欧美一区二区| a天堂中文字幕| 国产视频一区二区在线| 成人性生交大合| 欧美午夜精品免费| 日韩精品福利网| 奇米在线7777在线精品| 蜜臀av一区二区三区有限公司| 日本黄色片免费观看| 自拍偷拍欧美激情| 99精品一区二区三区无码吞精 | 亚洲色图视频网| 国内欧美视频一区二区| 色偷偷男人天堂| 亚洲欧美视频一区| 在线免费播放av| 久久久久久久网| 久久er精品视频| xxxx黄色片| 欧美日产在线观看| 日韩高清一区在线| 国产小视频你懂的| 久久嫩草精品久久久精品一| 青青青爽久久午夜综合久久午夜| 久久久久久久久久影视| 精品电影一区二区三区| 成人a区在线观看| 正在播放亚洲一区| 午夜精品久久久久久久久| 国产免费无遮挡吸奶头视频| 成人免费一区二区三区在线观看| 国产成a人亚洲精品| 精品视频免费看| 激情五月婷婷综合| 欧美中文字幕一二三区视频| 亚洲激情中文1区| 国产肥白大熟妇bbbb视频| 亚洲欧洲日韩av| 中文字幕xxx| 亚洲免费色视频| 国产jk精品白丝av在线观看| 久久综合狠狠综合久久综合88 | 久久精品99国产国产精| 国产一区二区视频在线观看免费| 中文字幕一区二区三区不卡| 日本黄色录像片| 中文字幕一区在线观看| 黄色正能量网站| 亚洲精品美国一| 2018国产精品| 中文字幕精品一区二区三区精品| 成人午夜大片免费观看| 日韩一区二区三区四区| 久久精品国产免费看久久精品| 国产1区2区在线观看| 亚洲一区二区影院| 欧美性生交大片| 男女性色大片免费观看一区二区| 天天躁日日躁aaaa视频| 国产欧美精品区一区二区三区 | 成人午夜短视频| 欧美午夜电影网| 国产成人自拍高清视频在线免费播放| 天天综合天天做| 久草在线在线精品观看| 欧美伦理电影网| 精品一区二区在线看| 欧美日韩二区三区| www.日韩在线| 亚洲国产精品ⅴa在线观看| 亚洲人人夜夜澡人人爽| 亚洲一区电影777| 99视频在线观看一区三区| 欧美tickle裸体挠脚心vk| 成人三级做爰av| 亚洲欧洲日韩女同| 中日韩一级黄色片| 国产一区二区视频在线| 国产97免费视频| 国产成人综合自拍| 久久品道一品道久久精品| 中文字幕在线播放视频| 悠悠色在线精品| 国产成人福利在线| 免费看欧美女人艹b| 欧美日韩精品电影| 国产中文字幕精品| 26uuu色噜噜精品一区二区| 无码一区二区精品| 午夜久久福利影院| 欧美日韩国产大片| 国产精品嫩草69影院| 一区二区三区久久| 欧美三级在线视频| 宇都宫紫苑在线播放| 亚洲精品美腿丝袜| 欧美影院一区二区三区| 91天堂素人约啪| 一区二区三区在线观看欧美| 91激情五月电影| 性生活一级大片| 亚洲最快最全在线视频| 国产成人在线色| 欧美剧在线免费观看网站 | 91精品国产黑色紧身裤美女| 激情综合网天天干| 久久青草国产手机看片福利盒子 | 日韩欧美二区三区| yy6080午夜| 免费人成黄页网站在线一区二区| 亚洲色婷婷一区二区三区| 男人的天堂久久精品| 日韩精品中午字幕| 亚洲自拍偷拍图| 国产毛片精品视频| 中文字幕av不卡| av男人的天堂av| 国产在线国偷精品产拍免费yy| 欧美精品丝袜久久久中文字幕| 成人激情电影免费在线观看| 中文字幕一区二区三区精华液| 最近中文字幕在线mv视频在线 | 欧美特黄一区二区三区| 美女www一区二区| 国产亚洲综合性久久久影院| 欧美一区二区三区观看| 成人18视频日本| 亚洲一区二区三区中文字幕| 91麻豆精品国产自产在线观看一区 | 成年人免费观看视频网站 | 成人伦理片在线| 亚洲精品免费播放| 欧美一区二区在线不卡| 中文字幕avav| 日韩经典一区二区| 久久久国产精品麻豆| 免费在线观看黄色小视频| 91在线观看高清| 日韩精品乱码免费| 国产亚洲精久久久久久| 色综合久久中文字幕综合网| av不卡中文字幕| 狠狠色狠狠色合久久伊人| 国产精品乱人伦中文| 欧美日韩三级一区二区| 日韩人妻无码精品综合区| 丁香五精品蜜臀久久久久99网站 | 久久你懂得1024| 色激情天天射综合网| 国产免费一区二区三区最新6| 亚洲高清视频在线| 久久综合丝袜日本网| 色综合天天天天做夜夜夜夜做| 成人av资源下载| 日韩在线一区二区三区| 欧美一区二区视频免费观看| 天天操天天舔天天射| 91色porny蝌蚪| 久久成人免费电影| 久久久久久久久一| 欧美在线观看一二区| 色诱av手机版| 午夜精品久久久久久久久久久| 欧美一区二区性放荡片| 一女三黑人理论片在线| 免费成人性网站| 亚洲视频狠狠干| 精品国免费一区二区三区| 色婷婷综合激情| 人人妻人人澡人人爽| 岛国大片在线免费观看| 国产制服丝袜一区| 中文字幕亚洲区| 精品久久免费看| 欧美日韩一区小说|