摘要:許久之后一些關于正則的黑科技才發現正則里也有較斷言的東東,好吧得了解了解這是什么。注括號是必須的,寫法有些語言并不完全支持,比如的正則并不支持后瞻斷言表達式,使用了會報錯的。
那么正則里的斷言是什么?之前大三學習《編譯原理》的時候老師講了點叫斷言的東西,但是這門課壓根就沒聽懂過,所以一直找不到有價值的東西,好吧原諒我懶惰無知,理論不適合我,我只適合搬磚。許久之后一些關于正則的黑科技才發現正則里也有較斷言的東東,好吧得了解了解這是什么。
引用一段來自百科的說明
用于查找在某些內容(但并不包括這些內容)之前或之后的東西,也就是說它們像b,^,$那樣用于指定一個位置,這個位置應該滿足一定的條件(即斷言),因此它們也被稱為零寬斷言。(來自百度百科)
斷言在一些教材里也稱作環視。
斷言寫法
前瞻斷言
(?=exp) 順序肯定環視,表示所在位置右側能夠匹配exp
(?!exp) 順序否定環視,表示所在位置右側不能匹配exp
后瞻斷言
(?<=exp) 逆序肯定環視,表示所在位置左側能夠匹配exp
(? 逆序否定環視,表示所在位置左側不能匹配exp
解析:
前瞻斷言(從當前位置向前測試)和后瞻斷言(從當前位置向后測試)。
具體的例子看使用方法吧。
注:
括號是必須的,寫法:(?!=...)
有些語言并不完全支持,比如:javascript的正則并不支持后瞻斷言表達式,使用了會報錯的。
其中exp是一個正則表達式可以是子模式,如:(?=((exp))。
環視也稱斷言;斷言是不占用字符串的((?=exp)所以不能引用,exp是占用字符串的)
使用方法(?=exp) 順序肯定環視,表示所在位置右側能夠匹配exp
來個javascript的例子,匹配.gif的文件名
var s="img.jpg,abc.gif,123.jpeg"; s.match(/w*(?=.gif)/);
結果:["abc"]
/w*(?=.gif)/中的w*表示可以有零個或多個字符,匹配到的是abc,那么(?=.gif)這個匹配到什么?其實他匹配到的只是一個位置,這就是斷言的初衷,匹配到的是介于abc與.gif的位置。
好吧不信來驗證下:
去掉正則表達式的w*,在匹配到的內容替換成#
var s="img.jpg,abc.gif,123.jpeg"; s.replace(/(?=.gif)/,"#");
結果:"img.jpg,abc#.gif,123.jpeg"
回到定義:(?=exp)順序肯定環視,表示所在位置右側能夠匹配exp;那么/w*(?=.gif)/的意思就是以.gif作為右邊的位置才匹配成功,那就會匹配到abc.gif這里就成功了,之前說過斷言匹配不占用字符寬度(即不結果不會包含斷言部分),所以匹配到的字符串就是w*即"abc"。
(?!exp) 順序否定環視,表示所在位置右側不能匹配exp
例子:匹配非.gif的文件名
var s="img.jpg,abc.gif,123.jpeg"; s.match(/(w*)(?:.)(?!gif)w*/g);
結果:["img.jpg", "123.jpeg"]
/(w*)(?:.)(?!gif)w*/g這個正則表示(w*)(?:.)的右邊不是gif匹配成功。
對于后瞻斷言的例子這里不舉例子,如果哪位有空填下吧。
使用例子來看一個來自網絡的問答例子:把一串數10000000000字以,分隔成10,000,000,000
這個例子0有點多看著耀眼,先從簡單的開始;好吧我們換一串字符串比如:12345678轉換成12,345,678。
正則怎么實現呢?
看代碼:
var s="12345678"; s.replace(/(?=(d{3})+(?!d))/g,",");
是的就這樣就可以了。
好吧,來分析下原理:
/(?=(d{3})+(?!d))/g,其中(d{3})+表示前面的三個數字串至少出現一組,而后接(?!d)則表示的是數字的右邊不是數字,
那么就是結尾,那/(?=(d{3})+(?!d))/匹配到的位置就是12與345678之間的位置,加了g表全局匹配,
所以繼續匹配到滿足條件的345與678之間的位置,在這些加,就有了12,345,678了。
如果想看這個例子的過程可以改寫下代碼:
var s="12345678"; s.replace(/(?=((d{3})+)(?!d))/g,function(){console.log(arguments);return ","});
結果:
循環1: ["", "345678", "678", 2, "12345678"]
循環2: ["", "678", "678", 5, "12345678"]
返回值:"12,345,678"
好吧,原理不再細說,自己復制代碼到瀏覽器控制臺執行看效果。
那么這個10000000000轉成10,000,000,000就很簡單了。
但是如果數字串的位數是3的倍數會出現在數字串前面也有一個,號,好吧再正則去掉result.replace(",","")。
后語上面舉的一些例子可能不足以說明問題,如果你是精通正則的高手望勿噴,當然多多指教那就更好了。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/80317.html
摘要:參考資料慕課網鬼斧神工之正則表達式正則表達式后向引用詳解正則表達式分鐘入門教程什么是正則表達式正則表達式是字符串的搜索和匹配的工具。貪婪模式懶惰模式后向引用分組捕獲的內容可以在表達式或其他程序中作進一步的處理。 參考資料 慕課網-鬼斧神工之正則表達式正則表達式后向引用詳解正則表達式30分鐘入門教程 什么是正則表達式? 正則表達式是字符串的搜索和匹配的工具。 正則表達式工具 一個測試正...
摘要:的正則表達式體系是參照建立的。字面量形式構造函數形式以上都是創建了一個內容為的正則表達式,其表示對一個手機號碼的校驗。按照給定的正則表達式進行替換,返回替換后的字符串。 正則表達式,也稱規則表達式,經常使用其來完成對字符串的校驗和過濾。由于正則表達式的靈活性、邏輯性和功能性都非常強大,而且 可以利用很簡單的方式完成對復雜字符串的控制,所以很多程序語言都支持正則表達式。在JavaScri...
摘要:復習正則表達式最近研究正好也有正則方面的內容看看有什么新特性順便又把精通正則表達式拿出來粗看了前面幾章節于是給自己出了幾道題還做了一點總結和和一般作為初學者看到這么多這些鬼都會頭大了下面我將詳細講解一下退格符另外其實我一直都搞不清楚匹配一 復習正則表達式 最近研究ES6, 正好ES6也有正則方面的內容, 看看有什么新特性, 順便又把精通正則表達式拿出來粗看了前面幾章節, 于是給自己出了...
閱讀 3043·2021-11-25 09:43
閱讀 1626·2021-11-24 11:15
閱讀 2359·2021-11-22 15:25
閱讀 3501·2021-11-11 16:55
閱讀 3240·2021-11-04 16:10
閱讀 2773·2021-09-14 18:02
閱讀 1685·2021-09-10 10:50
閱讀 1070·2019-08-29 15:39