成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

javascript正則斷言的理解

kun_jian / 2302人閱讀

摘要:許久之后一些關(guān)于正則的黑科技才發(fā)現(xiàn)正則里也有較斷言的東東,好吧得了解了解這是什么。注括號是必須的,寫法有些語言并不完全支持,比如的正則并不支持后瞻斷言表達(dá)式,使用了會報錯的。

之前大三學(xué)習(xí)《編譯原理》的時候老師講了點叫斷言的東西,但是這門課壓根就沒聽懂過,所以一直找不到有價值的東西,好吧原諒我懶惰無知,理論不適合我,我只適合搬磚。許久之后一些關(guān)于正則的黑科技才發(fā)現(xiàn)正則里也有較斷言的東東,好吧得了解了解這是什么。

那么正則里的斷言是什么?

引用一段來自百科的說明

用于查找在某些內(nèi)容(但并不包括這些內(nèi)容)之前或之后的東西,也就是說它們像b,^,$那樣用于指定一個位置,這個位置應(yīng)該滿足一定的條件(即斷言),因此它們也被稱為零寬斷言。(來自百度百科)

斷言在一些教材里也稱作環(huán)視。

斷言寫法

前瞻斷言

(?=exp) 順序肯定環(huán)視,表示所在位置右側(cè)能夠匹配exp

(?!exp) 順序否定環(huán)視,表示所在位置右側(cè)不能匹配exp

后瞻斷言

(?<=exp) 逆序肯定環(huán)視,表示所在位置左側(cè)能夠匹配exp

(? 逆序否定環(huán)視,表示所在位置左側(cè)不能匹配exp

解析:
前瞻斷言(從當(dāng)前位置向前測試)和后瞻斷言(從當(dāng)前位置向后測試)。

具體的例子看使用方法吧。

注:

括號是必須的,寫法:(?!=...)

有些語言并不完全支持,比如:javascript的正則并不支持后瞻斷言表達(dá)式,使用了會報錯的。

其中exp是一個正則表達(dá)式可以是子模式,如:(?=((exp))。

環(huán)視也稱斷言;斷言是不占用字符串的((?=exp)所以不能引用,exp是占用字符串的)

使用方法

(?=exp) 順序肯定環(huán)視,表示所在位置右側(cè)能夠匹配exp

來個javascript的例子,匹配.gif的文件名

var s="img.jpg,abc.gif,123.jpeg";
s.match(/w*(?=.gif)/);

結(jié)果:["abc"]

/w*(?=.gif)/中的w*表示可以有零個或多個字符,匹配到的是abc,那么(?=.gif)這個匹配到什么?其實他匹配到的只是一個位置,這就是斷言的初衷,匹配到的是介于abc.gif的位置。
好吧不信來驗證下:
去掉正則表達(dá)式的w*,在匹配到的內(nèi)容替換成#

var s="img.jpg,abc.gif,123.jpeg";
s.replace(/(?=.gif)/,"#");

結(jié)果:"img.jpg,abc#.gif,123.jpeg"

回到定義:(?=exp)順序肯定環(huán)視,表示所在位置右側(cè)能夠匹配exp;那么/w*(?=.gif)/的意思就是以.gif作為右邊的位置才匹配成功,那就會匹配到abc.gif這里就成功了,之前說過斷言匹配不占用字符寬度(即不結(jié)果不會包含斷言部分),所以匹配到的字符串就是w*即"abc"。

(?!exp) 順序否定環(huán)視,表示所在位置右側(cè)不能匹配exp

例子:匹配非.gif的文件名

var s="img.jpg,abc.gif,123.jpeg";
s.match(/(w*)(?:.)(?!gif)w*/g);

結(jié)果:["img.jpg", "123.jpeg"]

/(w*)(?:.)(?!gif)w*/g這個正則表示(w*)(?:.)的右邊不是gif匹配成功。

對于后瞻斷言的例子這里不舉例子,如果哪位有空填下吧。

使用例子

來看一個來自網(wǎng)絡(luò)的問答例子:把一串?dāng)?shù)10000000000字以,分隔成10,000,000,000

這個例子0有點多看著耀眼,先從簡單的開始;好吧我們換一串字符串比如:12345678轉(zhuǎn)換成12,345,678

正則怎么實現(xiàn)呢?
看代碼:

var s="12345678";
s.replace(/(?=(d{3})+(?!d))/g,",");

是的就這樣就可以了。
好吧,來分析下原理:

/(?=(d{3})+(?!d))/g,其中(d{3})+表示前面的三個數(shù)字串至少出現(xiàn)一組,而后接(?!d)則表示的是數(shù)字的右邊不是數(shù)字,
那么就是結(jié)尾,那/(?=(d{3})+(?!d))/匹配到的位置就是12345678之間的位置,加了g表全局匹配,
所以繼續(xù)匹配到滿足條件的345678之間的位置,在這些加,就有了12,345,678了。

如果想看這個例子的過程可以改寫下代碼:

var s="12345678";
s.replace(/(?=((d{3})+)(?!d))/g,function(){console.log(arguments);return ","});

結(jié)果:
循環(huán)1: ["", "345678", "678", 2, "12345678"]
循環(huán)2: ["", "678", "678", 5, "12345678"]
返回值:"12,345,678"

好吧,原理不再細(xì)說,自己復(fù)制代碼到瀏覽器控制臺執(zhí)行看效果。

那么這個10000000000轉(zhuǎn)成10,000,000,000就很簡單了。

但是如果數(shù)字串的位數(shù)是3的倍數(shù)會出現(xiàn)在數(shù)字串前面也有一個,號,好吧再正則去掉result.replace(",","")。

后語

上面舉的一些例子可能不足以說明問題,如果你是精通正則的高手望勿噴,當(dāng)然多多指教那就更好了。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/80317.html

相關(guān)文章

  • 正則與JS中正則

    摘要:注意本文將正則與中的正則分開討論。正則零寬斷言更多參考各種語言對于正則不同支持參考單行模式與多行模式通過設(shè)置正則表達(dá)式后的修飾符可開啟對應(yīng)的匹配模式單行模式和多行模式。 最近這段時間幫同學(xué)處理一些文檔, 涉及到一些結(jié)構(gòu)化文檔的工作大部分都得使用正則表達(dá)式, 之前對于正則的認(rèn)識大多來源于語言書上那幾頁的介紹, 自己也沒有用過幾次。這里將我之前感到模糊的概念作個整理。因為對JS了解多點,所...

    firim 評論0 收藏0
  • 正則表達(dá)式基礎(chǔ)筆記

    摘要:參考資料慕課網(wǎng)鬼斧神工之正則表達(dá)式正則表達(dá)式后向引用詳解正則表達(dá)式分鐘入門教程什么是正則表達(dá)式正則表達(dá)式是字符串的搜索和匹配的工具。貪婪模式懶惰模式后向引用分組捕獲的內(nèi)容可以在表達(dá)式或其他程序中作進(jìn)一步的處理。 參考資料 慕課網(wǎng)-鬼斧神工之正則表達(dá)式正則表達(dá)式后向引用詳解正則表達(dá)式30分鐘入門教程 什么是正則表達(dá)式? 正則表達(dá)式是字符串的搜索和匹配的工具。 正則表達(dá)式工具 一個測試正...

    Enlightenment 評論0 收藏0
  • JavaScript正則表達(dá)式RegExp

    摘要:的正則表達(dá)式體系是參照建立的。字面量形式構(gòu)造函數(shù)形式以上都是創(chuàng)建了一個內(nèi)容為的正則表達(dá)式,其表示對一個手機(jī)號碼的校驗。按照給定的正則表達(dá)式進(jìn)行替換,返回替換后的字符串。 正則表達(dá)式,也稱規(guī)則表達(dá)式,經(jīng)常使用其來完成對字符串的校驗和過濾。由于正則表達(dá)式的靈活性、邏輯性和功能性都非常強(qiáng)大,而且 可以利用很簡單的方式完成對復(fù)雜字符串的控制,所以很多程序語言都支持正則表達(dá)式。在JavaScri...

    SexySix 評論0 收藏0
  • 精通正則表達(dá)式

    摘要:文章同步于正則表達(dá)式是一種處理字符串匹配的語言。如果同時使用其它元字符,我們就能構(gòu)造出功能更強(qiáng)大的正則表達(dá)式。 文章同步于 Github blog 正則表達(dá)式(Regular Expression)是一種處理字符串匹配的語言。 很可能你使用過 Windows/Dos 下用于文件查找的通配符(wildcard),也就是 * 和 ? 。如果你想查找某個目錄下的所有的Word文檔的話,你會搜...

    elarity 評論0 收藏0
  • 正則表達(dá)式中[]和和B區(qū)別及匹配分析思路

    摘要:復(fù)習(xí)正則表達(dá)式最近研究正好也有正則方面的內(nèi)容看看有什么新特性順便又把精通正則表達(dá)式拿出來粗看了前面幾章節(jié)于是給自己出了幾道題還做了一點總結(jié)和和一般作為初學(xué)者看到這么多這些鬼都會頭大了下面我將詳細(xì)講解一下退格符另外其實我一直都搞不清楚匹配一 復(fù)習(xí)正則表達(dá)式 最近研究ES6, 正好ES6也有正則方面的內(nèi)容, 看看有什么新特性, 順便又把精通正則表達(dá)式拿出來粗看了前面幾章節(jié), 于是給自己出了...

    DDreach 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<