国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

javascript正則斷言的理解

kun_jian / 2284人閱讀

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

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

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

引用一段來自百科的說明

用于查找在某些內容(但并不包括這些內容)之前或之后的東西,也就是說它們像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))/匹配到的位置就是12345678之間的位置,加了g表全局匹配,
所以繼續匹配到滿足條件的345678之間的位置,在這些加,就有了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

相關文章

  • 正則與JS中正則

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

    firim 評論0 收藏0
  • 正則表達式基礎筆記

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

    Enlightenment 評論0 收藏0
  • JavaScript正則表達式RegExp

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

    SexySix 評論0 收藏0
  • 精通正則表達式

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

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

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

    DDreach 評論0 收藏0

發表評論

0條評論

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