成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

javascript正則斷言的理解

kun_jian / 2345人閱讀

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

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

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

引用一段來(lái)自百科的說(shuō)明

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

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

斷言寫(xiě)法

前瞻斷言

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

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

后瞻斷言

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

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

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

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

注:

括號(hào)是必須的,寫(xiě)法:(?!=...)

有些語(yǔ)言并不完全支持,比如:javascript的正則并不支持后瞻斷言表達(dá)式,使用了會(huì)報(bào)錯(cuò)的。

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

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

使用方法

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

來(lái)個(gè)javascript的例子,匹配.gif的文件名

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

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

/w*(?=.gif)/中的w*表示可以有零個(gè)或多個(gè)字符,匹配到的是abc,那么(?=.gif)這個(gè)匹配到什么?其實(shí)他匹配到的只是一個(gè)位置,這就是斷言的初衷,匹配到的是介于abc.gif的位置。
好吧不信來(lái)驗(yàn)證下:
去掉正則表達(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作為右邊的位置才匹配成功,那就會(huì)匹配到abc.gif這里就成功了,之前說(shuō)過(guò)斷言匹配不占用字符寬度(即不結(jié)果不會(huì)包含斷言部分),所以匹配到的字符串就是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這個(gè)正則表示(w*)(?:.)的右邊不是gif匹配成功。

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

使用例子

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

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

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

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

是的就這樣就可以了。
好吧,來(lái)分析下原理:

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

如果想看這個(gè)例子的過(guò)程可以改寫(xiě)下代碼:

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ì)說(shuō),自己復(fù)制代碼到瀏覽器控制臺(tái)執(zhí)行看效果。

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

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

后語(yǔ)

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

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/80317.html

相關(guān)文章

  • 正則與JS中正則

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

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

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

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

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

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

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

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

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

    DDreach 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<