婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 正則基礎之 環視 Lookaround

正則基礎之 環視 Lookaround

熱門標簽:電銷機器人公司簡介 湖南企業智能外呼系統供應商 錫林郭勒盟地圖標注位置 RO地圖標注app 知名的電話機器人 自制電銷機器人 高德地圖標注短信簽約 百音電話機器人 福州工作銷售電話機器人

1       環視基礎

環視只進行子表達式的匹配,不占有字符,匹配到的內容不保存到最終的匹配結果,是零寬度的。環視匹配的最終結果就是一個位置。

環視的作用相當于對所在位置加了一個附加條件,只有滿足這個條件,環視子表達式才能匹配成功。

環視按照方向劃分有順序和逆序兩種,按照是否匹配有肯定和否定兩種,組合起來就有四種環視。順序環視相當于在當前位置右側附加一個條件,而逆序環視相當于在當前位置左側附加一個條件。

表達式

說明

(?=Expression)

逆序肯定環視,表示所在位置左側能夠匹配Expression

(?!Expression)

逆序否定環視,表示所在位置左側不能匹配Expression

(?=Expression)

順序肯定環視,表示所在位置右側能夠匹配Expression

(?!Expression)

順序否定環視,表示所在位置右側不能匹配Expression

 對于環視的叫法,有的文檔里叫預搜索,有的叫什么什么斷言的,這里使用了更多人容易接受的《精通正則表達式》中“環視”的叫法,其實叫什么無所謂,只要知道是什么作用就是了,就這么幾個語法規則, 還是很容易記的

2       環視匹配原理

 環視是正則中的一個難點,對于環視的理解,可以從應用和原理兩個角度理解,如果想理解得更清晰、深入一些,還是從原理的角度理解好一些,正則匹配基本原理參考 NFA引擎匹配原理。

上面提到環視相當于對“所在位置”附加了一個條件,環視的難點在于找到這個“位置”,這一點解決了,環視也就沒什么秘密可言了。

順序環視匹配過程

對于順序肯定環視(?=Expression)來說,當子表達式Expression匹配成功時,(?=Expression)匹配成功,并報告(?=Expression)匹配當前位置成功。

對于順序否定環視(?!Expression)來說,當子表達式Expression匹配成功時,(?!Expression)匹配失敗;當子表達式Expression匹配失敗時,(?!Expression)匹配成功,并報告(?!Expression)匹配當前位置成功;

順序肯定環視的例子已在NFA引擎匹配原理中講解過了,這里再講解一下順序否定環視。

 

源字符串:aap>one/p>bbdiv>two/div>cc

正則表達式:(?!/?p\b)[^>]+>

這個正則的意義就是匹配除p…>或/p>之外的其余標簽。

匹配過程:

首先由字符“”取得控制權,從位置0開始匹配,由于“”匹配“a”失敗,在位置0處整個表達式匹配失敗,第一次迭代匹配失敗,正則引擎向前傳動,由位置1處開始嘗試第二次迭代匹配。

重復以上過程,直到位置2,“”匹配“”成功,控制權交給“(?!/?p\b)”;“(?!/?p\b)”子表達式取得控制權后,進行內部子表達式的匹配。首先由“/?”取得控制權,嘗試匹配“p”失敗,進行回溯,不匹配,控制權交給“p”;由“p”來嘗試匹配“p”,匹配成功,控制權交給“\b”;由“\b”來嘗試匹配位置4,匹配成功。此時子表達式匹配完成,“/?p\b”匹配成功,那么環視表達式“(?!/?p\b)”就匹配失敗。在位置2處整個表達式匹配失敗,新一輪迭代匹配失敗,正則引擎向前傳動,由位置3處開始嘗試下一輪迭代匹配。

在位置8處也會遇到一輪“/?p\b”匹配“/p”成功,而導致環視表達式“(?!/?p\b)”匹配失敗,從而導致整個表達式匹配失敗的過程。

重復以上過程,直到位置14,“”匹配“”成功,控制權交給“(?!/?p\b)”;“/?”嘗試匹配“d”失敗,進行回溯,不匹配,控制權交給“p”;由“p”來嘗試匹配“d”,匹配失敗,已經沒有備選狀態可供回溯,匹配失敗。此時子表達式匹配完成,“/?p\b”匹配失敗,那么環視表達式“(?!/?p\b)”就匹配成功。匹配的結果是位置15,然后控制權交給“[^>]+”;由“[^>]+”從位置15進行嘗試匹配,可以成功匹配到“div”,控制權交給“>”;由“>”來匹配“>”。

此時正則表達式匹配完成,報告匹配成功。匹配結果為“div>”,開始位置為14,結束位置為19。其中“”匹配“”,“(?!/?p\b)”匹配位置15,“[^>]+”匹配字符串“div”,“>”匹配“>”。

逆序環視基礎

對于逆序肯定環視(?=Expression)來說,當子表達式Expression匹配成功時,(?=Expression)匹配成功,并報告(?=Expression)匹配當前位置成功。

對于逆序否定環視(?!Expression)來說,當子表達式Expression匹配成功時,(?!Expression)匹配失敗;當子表達式Expression匹配失敗時,(?!Expression)匹配成功,并報告(?!Expression)匹配當前位置成功;

順序環視相當于在當前位置右側附加一個條件,所以它的匹配嘗試是從當前位置開始的,然后向右嘗試匹配,直到某一位置使得匹配成功或失敗為止。而逆序環視的特殊處在于,它相當于在當前位置左側附加一個條件,所以它不是在當前位置開始嘗試匹配的,而是從當前位置左側某一位置開始,匹配到當前位置為止,報告匹配成功或失敗。

順序環視嘗試匹配的起點是確定的,就是當前位置,而匹配的終點是不確定的。逆序環視匹配的起點是不確定的,是當前位置左側某一位置,而匹配的終點是確定的,就是當前位置。

所以順序環視相對是簡單的,而逆序環視相對是復雜的。這也就是為什么大多數語言和工具都提供了對順序環視的支持,而只有少數語言提供了對逆序環視支持的原因。

JavaScript中只支持順序環視,不支持逆序環視。

Java中雖然順序環視和逆序環視都支持,但是逆序環視只支持長度確定的表達式,逆序環視中量詞只支持“?”,不支持其它長度不定的量詞。長度確定時,引擎可以向左查找固定長度的位置作為起點開始嘗試匹配,而如果長度不確定時,就要從位置0開始嘗試匹配,處理的復雜度是顯而易見的。

目前只有.NET中支持不確定長度的逆序環視。

逆序環視匹配過程

源字符串:div>a test/div>

正則表達式:(?=div>)[^]+(?=/div>)

這個正則的意義就是匹配div>和/div>標簽之間的內容,而不包括div>和/div>標簽本身。

匹配過程:

首先由“(?=div>)”取得控制權,從位置0開始匹配,由于位置0是起始位置,左側沒有任何內容,所以“div>”必然匹配失敗,從而環視表達式“(?=div>)”匹配失敗,導致整個表達式在位置0處匹配失敗。第一輪迭代匹配失敗,正則引擎向前傳動,由位置1處開始嘗試第二次迭代匹配。

直到傳動到位置5,“(?=div>)”取得控制權,向左查找5個位置,由位置0開始匹配,由“div>”匹配“div>”成功,從而“(?=div>)”匹配成功,匹配的結果為位置5,控制權交給“[^]+”;“[^]+”從位置5開始嘗試匹配,匹配“a test”成功,控制權交給“(?=/div>)”;由“/div>”匹配“/div>”成功,從而“(?=/div>)”匹配成功,匹配結果為位置11。

此時正則表達式匹配完成,報告匹配成功。匹配結果為“a test”,開始位置為5,結束位置為11。其中“(?=div>)”匹配位置5,“[^]+”匹配“a test”,“(?=/div>)”匹配位置11。

逆序否定環視的匹配過程與上述過程類似,區別只是當Expression匹配失敗時,逆序否定表達式(?!Expression)才匹配成功。

到此環視的匹配原理已基本講解完,環視也就沒有什么秘密可言了,所需要的,也只是多加練習而已。

3       環視應用

今天寫累了,暫時就給出一個環視的綜合應用實例吧,至于環視的應用場景和技巧,后面再整理。

需求:數字格式化成用“,”的貨幣格式。

正則表達式:(?=\d)(?!\.\d*)(?=(?:\d{3})+(?:\.\d+|$))

測試代碼:

double[] data = new double[] { 0, 12, 123, 1234, 12345, 123456, 1234567, 123456789, 1234567890, 12.345, 123.456, 1234.56, 12345.6789, 123456.789, 1234567.89, 12345678.9 };

foreach (double d in data)

{

    richTextBox2.Text += "源字符串:" + d.ToString().PadRight(15) + "格式化:" + Regex.Replace(d.ToString(), @"(?=\d)(?!\.\d*)(?=(?:\d{3})+(?:\.\d+|$))", ",") + "\n";

}

輸出結果:

源字符串:0              格式化:0

源字符串:12             格式化:12

源字符串:123            格式化:123

源字符串:1234           格式化:1,234

源字符串:12345          格式化:12,345

源字符串:123456         格式化:123,456

源字符串:1234567        格式化:1,234,567

源字符串:123456789      格式化:123,456,789

源字符串:1234567890     格式化:1,234,567,890

源字符串:12.345         格式化:12.345

源字符串:123.456        格式化:123.456

源字符串:1234.56        格式化:1,234.56

源字符串:12345.6789     格式化:12,345.6789

源字符串:123456.789     格式化:123,456.789

源字符串:1234567.89     格式化:1,234,567.89

源字符串:12345678.9     格式化:12,345,678.9

實現分析:

首先根據需求可以確定是把一些特定的位置替換為“,”,接下來就是分析并找到這些位置的規律,并抽象出來以正則表達式來表示。

1、   這個位置的左側必須為數字

2、   這個位置右側到出現“.”或結尾為止,必須是數字,且數字的個數必須為3的倍數

3、   這個位置左側相隔任意個數字不能出現“.”

由以上三條,就可以完全確定這些位置,只要實現以上三條,組合一下正則表達式就可以了。

根據分析,最終匹配的結果是一個位置,所以所有子表達式都要求是零寬度。

1、   是對當前所在位置左側附加的條件,所以要用到逆序環視,因為要求必須出現,所以是肯定的,符合這一條件的子表達式即為“(?=\d)

2、   是對當前所在位置右側附加的條件,所以要用到順序環視,也是要求出現,所以是肯定的,是數字,且個數為3的倍數,即“(?=(?:\d{3})*)”,到出現“.”或結尾為止,即“(?=(?:\d{3})*(?:\.|$))

3、   是對當前所在位置左側附加的條件,所以要用到逆序環視,因為要求不能出現,所以是否定的,即“(?!\.\d*)

因為零寬度的子表達式是非互斥的,最后匹配的都是同一個位置,所以先后順序是不影響最后的匹配結果的,可以任意組合,只是習慣上把逆序環視寫在左側,順序環視寫在右側。

您可能感興趣的文章:
  • 正則表達式中環視的簡單應用示例【基于java】
  • 正則應用之 逆序環視探索 .
  • 正則匹配原理之 逆序環視深入 .
  • javascript 正則表達式分組、斷言詳解
  • 正則表達式之零寬斷言實例詳解【基于PHP】
  • 正則表達式零寬斷言詳解
  • 正則表達式斷言、巡視(Assertions)、正向斷言、反向斷言介紹
  • 正則表達式環視概念與用法分析

標簽:秦皇島 怒江 玉林 昆明 河北 西寧 吉林 茂名

巨人網絡通訊聲明:本文標題《正則基礎之 環視 Lookaround》,本文關鍵詞  正則,基礎,之,環視,Lookaround,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《正則基礎之 環視 Lookaround》相關的同類信息!
  • 本頁收集關于正則基礎之 環視 Lookaround的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    国产精品一二三四区| 国产不卡在线视频| 国产精品网站在线观看| 欧美性生活久久| 国产一区91精品张津瑜| 亚洲精品日韩一| 久久精品一区二区三区不卡牛牛 | 久久久www成人免费无遮挡大片| 日韩理论片在线| 这里只有精品免费| 91亚洲精品久久久蜜桃| 国产高清精品网站| 亚洲国产精品影院| 成人免费在线观看入口| 久久嫩草精品久久久精品一| 欧美一级一区二区| 欧美日韩视频第一区| 一本久道中文字幕精品亚洲嫩| 亚洲人成伊人成综合网小说| 本田岬高潮一区二区三区| 欧美精品一区在线观看| 国产乱妇无码大片在线观看| 亚洲风情在线资源站| 亚洲婷婷综合色高清在线| 久久夜色精品一区| 欧美mv和日韩mv的网站| 欧美丰满一区二区免费视频 | 久久久777精品电影网影网| 欧美日韩五月天| 日本韩国欧美在线| 色综合久久综合| 91丨porny丨国产| av电影一区二区| 成人的网站免费观看| 粉嫩一区二区三区在线看| 国产麻豆9l精品三级站| 国内精品写真在线观看| 美女视频网站久久| 男女性色大片免费观看一区二区 | 色综合久久综合网97色综合| 成人国产亚洲欧美成人综合网| 亚洲免费在线看| 中文字幕一区二区三区四区不卡 | 久久99精品国产麻豆不卡| 欧美激情自拍偷拍| 欧美激情一区二区三区全黄| 久久精品夜夜夜夜久久| 国产女主播在线一区二区| 中文文精品字幕一区二区| 国产精品久久久久久久久图文区 | 亚洲欧洲国产日本综合| 国产精品丝袜91| 亚洲欧美激情插 | 国产精品婷婷午夜在线观看| 国产亚洲精品中文字幕| 精品久久久久香蕉网| 久久亚洲精华国产精华液| 国产日韩亚洲欧美综合| 亚洲欧美另类在线| 午夜久久久影院| 精品一区二区三区香蕉蜜桃| 国产黄色成人av| 色哟哟精品一区| 欧美日韩三级一区二区| 2021中文字幕一区亚洲| 欧美激情在线观看视频免费| 亚洲欧美偷拍三级| 午夜亚洲国产au精品一区二区| 综合色天天鬼久久鬼色| 亚洲成人av资源| 国产最新精品免费| 一本大道久久a久久综合婷婷 | 欧美影院午夜播放| 欧美一区二区三区在线| 日本一区二区三区高清不卡 | 欧美国产精品一区二区| 亚洲日本va午夜在线影院| 水蜜桃久久夜色精品一区的特点| 亚洲视频每日更新| 亚洲大片在线观看| 国产伦精品一区二区三区免费| 麻豆精品精品国产自在97香蕉| 亚洲精品视频在线| 韩日av一区二区| 99热精品国产| 91精品欧美一区二区三区综合在| 欧美福利一区二区| 国产欧美一区二区三区在线看蜜臀| 精品久久国产字幕高潮| 日韩一区欧美一区| 秋霞成人午夜伦在线观看| av爱爱亚洲一区| 精品国内片67194| 亚洲一区二区三区四区在线 | 国产精品乱码一区二区三区软件| 久久久久久久久久美女| 亚洲国产精品自拍| 成人黄色在线看| 日韩精品一区二| av电影在线观看一区| 69堂成人精品免费视频| 中文字幕一区二区三区av| 久久精品国产网站| 在线免费观看一区| 国产精品无遮挡| 裸体在线国模精品偷拍| 欧洲一区二区三区免费视频| 久久久91精品国产一区二区精品| 国产视频一区二区三区在线观看| 日韩欧美一区二区免费| 一区二区三区日韩精品| 国产一区啦啦啦在线观看| 欧美美女网站色| 亚洲激情五月婷婷| 成人黄色国产精品网站大全在线免费观看| 成人性视频网站| 日韩女优av电影在线观看| 亚洲高清久久久| 欧美影视一区二区三区| 亚洲精品一卡二卡| 成人av免费网站| 欧美国产禁国产网站cc| 韩国午夜理伦三级不卡影院| 欧美一区二区在线播放| 免费成人在线视频观看| 欧美日韩国产片| 亚洲国产精品综合小说图片区| 精品一区在线看| 欧美大片一区二区| 久久精品国产精品亚洲综合| 日韩视频免费观看高清完整版在线观看 | 日韩精品国产精品| 欧美亚洲免费在线一区| 亚洲一区二区三区中文字幕| 91久久精品午夜一区二区| 一区二区三区美女| 欧美性高清videossexo| 亚洲午夜日本在线观看| 欧美日韩国产免费| 日一区二区三区| 日韩美一区二区三区| 韩国在线一区二区| 亚洲国产精品精华液ab| 成人avav影音| 亚洲欧洲美洲综合色网| 在线观看网站黄不卡| 日韩电影在线一区二区三区| 欧美成人精品高清在线播放| 国产伦精品一区二区三区免费迷| 精品视频在线免费| 麻豆国产欧美日韩综合精品二区| 色综合激情五月| 亚洲 欧美综合在线网络| 日韩午夜三级在线| 国产精品18久久久久久久久久久久| 在线区一区二视频| 日本亚洲三级在线| 久久综合色婷婷| 91丝袜美腿高跟国产极品老师| 精品福利在线导航| 99久久精品国产观看| 亚洲午夜日本在线观看| 精品va天堂亚洲国产| 成人a区在线观看| 亚洲一区二区三区爽爽爽爽爽 | 丝袜国产日韩另类美女| 精品国产99国产精品| 91在线视频播放地址| 蜜臀精品一区二区三区在线观看| 色婷婷精品久久二区二区蜜臀av | 青青草精品视频| 国产日韩三级在线| 欧美午夜一区二区三区| xnxx国产精品| 色婷婷久久久久swag精品| 奇米精品一区二区三区在线观看| 欧美男男青年gay1069videost | 亚洲福中文字幕伊人影院| 精品国产精品网麻豆系列| 97久久精品人人澡人人爽| 日产精品久久久久久久性色| 亚洲国产激情av| 日韩欧美久久久| 在线一区二区视频| 国产激情一区二区三区| 日本视频免费一区| 中文字幕日韩一区| 日韩欧美亚洲国产另类| 欧美吻胸吃奶大尺度电影| 国产精品一区三区| 男女性色大片免费观看一区二区| 欧美岛国在线观看| 在线中文字幕不卡| 成人黄色软件下载| 精品一二线国产| 五月开心婷婷久久| 亚洲视频狠狠干| 久久久不卡影院| 欧美成人video| 欧美另类高清zo欧美|