前瞻斷言與后瞻斷言:JavaScript 正則表達式的秘密武器

JavaScript 中的前瞻斷言(lookahead)和后瞻斷言(lookbehind)相信用過的小伙伴就知道它的威力了,在一些特定的需求場景下,可以做到四兩撥千斤的作用,今天讓我們來盤點一下在 JavaScript 正則表達式中這兩個秘密武器吧。

前瞻斷言和后瞻斷言,在其他語言的正則表達式中也存在,這個特性不是 JavaScript 的專屬

概念定義

不管是前瞻斷言還是后瞻斷言,最終目的都是尋找在指定的模式(pattern)下,這個指定模式(pattern)前面或者后面的字符子串, 得到的結果永遠是這些 前面或者后面的字符子串 而不是這個指定的模式(pattern)本身

前瞻或后瞻在匹配的時候不會實際匹配和捕獲字符,只是檢查某個位置前后是否符合指定條件,并不會改變正則的 lastIndex,在檢查完之后,正則表達式的其他部分繼續進行匹配。

前瞻斷言

在中文互聯網上 lookahead 被翻譯成 前瞻斷言、先行斷言等

前瞻斷言,是用于在檢查后面的子串是否匹配某個模式, 前瞻斷言包括正向前瞻負向前瞻斷言

  • 正向前瞻X(?=pattern),如果 X 后面的子串符合 pattern模式, 就匹配 X。
  • 負向前瞻X(?!pattern), 如果 X 后面的子串不符合 pattern模式, 就匹配 X。

后瞻斷言

在中文互聯網上 lookahead 被翻譯成 后瞻斷言、后行斷言等

后瞻斷言,是用于在檢查前面的子串是否匹配某個模式, 后瞻斷言包括正向后瞻斷言負向后瞻斷言

  • 正向后瞻(?<=pattern)X,匹配 X 前面滿足pattern 的子串。
  • 負向后瞻(?<!pattern)X,匹配 X 前面不滿足 pattern 的子串。

這里有點需要注意的是 前瞻斷言是檢查后面的子串是否匹配,后瞻斷言是檢查前面的子串是否匹配。

這個規則感覺就是主打一個叛逆…

直接上代碼

前瞻斷言

  • 正向前瞻

利用正向前瞻實現金額字符串格式化為帶有千分位分隔符的格式。 例如 12345, 轉化為 12,345

解釋一下上述的正則表達式:

  • \B:匹配非單詞邊界。確保逗號不會被添加在開頭
  • (?=(\d{3})+(?!\d)):匹配符合右側有一個或多個三位數字,且這些三位數字不是字符串的結尾。

這個正則同時使用了正向前瞻和負向前瞻。剛開始可能比較繞,可以看看下面的可視化原理慢慢消化一下

通過上述正則匹配到的結果,再使用 replace 方法用來替換為逗號, 即可實現金額的千分位

  • 負向前瞻

我們可以用負向前瞻來過濾一些不符合條件的字符子串。例如下面我們需要匹配出不是金額的數字。

/\d+\b(?!元)/g 正則語法的意思是 “搜索 字符中的數字,但前提是后面沒有 這個字符”。

\b 是用于匹配一個單詞的邊界。這里使用 \b 就是為了匹配完整的數字。不然上面的測試用例里面的 15 中 的數字 1 也符合屬于數字,而且1后面也沒有跟 這個字符

單詞邊界指的是在單詞字符(字母、數字或下劃線)和非單詞字符(如空格、標點符號或其他字符)之間的位置,同時字符串的開頭或結尾也存在單詞的邊界。

后瞻斷言

  • 正向后瞻

正向后瞻是如果當前匹配項前面有特定的匹配子串的話,當前匹配項就會被匹配,否則就跳過。

這里匹配 $ 后面的金額, 我們可以用正向后瞻斷言去匹配出來。只有這個數字前面的內容滿足 $ 就會匹配上,并返回到最終的結果中去。

  • 負向后瞻

如果你剛看完上面的正向后瞻的示例代碼,此時你想在上面的基礎上,只匹配金額前面只有一個$ 的, 這時候我們就可以用負向后瞻去做進一步約束。

這里使用 負向后瞻并不是最優解,這里只是為了做代碼演示構造的場景。

可以從可視化正則里面看出,負向后瞻就是只要當前匹配項前面不是 $$的時候,才進行匹配,所以 $$34 就會被忽略掉

不過為了應用這個例子,我這里是故意這樣處理的,實際上為了滿足只匹配一個 $ 的金額數字的話,我們可以直接在上面的 正則加上 \s 即可, 即: /(?<=\s\$)\d+/g

兼容性

前瞻斷言的兼容性是最好的,基本上是全綠的狀態,直接無腦沖就行了。

當我查caniuse 的時候,有被震驚到,第一次遇到這種兼容性這么好特性。要是前端所有的標準屬性有這兼容性就好了,好了,有點扯遠了哈。

后瞻斷言的兼容性差一些,除了在 Safari 瀏覽器中兼容性稍微差點,其他的都支持度很不錯。

小結

相信通過上面的介紹,你已經掌握了使用 前瞻斷言和后瞻斷言的精髓了,相信我使用它可以讓你寫正則的速度嗖嗖的,下班早早的。

如果這篇文章對你有幫助,歡迎點贊👍、關注?、轉發 ? !

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/46296.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/46296.shtml
英文地址,請注明出處:http://en.pswp.cn/web/46296.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

昇思25天學習打卡營第14天|munger85

基于MindNLPMusicGen生成自己的個性化音樂 這個所謂的個性化的音樂就是指你輸入一段文字它會根據這個文字輸出一段音樂這個音樂是貼近于那段文字的所以叫做文生成音樂&#xff0c; 如果網絡正常的話就可以直接從下載這個模型。 那么音樂生成的有兩種方式呢有兩種方式&#xff…

【C++初階】C/C++內存管理

【C初階】C/C內存管理 &#x1f955;個人主頁&#xff1a;開敲&#x1f349; &#x1f525;所屬專欄&#xff1a;C&#x1f96d; &#x1f33c;文章目錄&#x1f33c; 1. C/C內存分布 2. C語言中動態內存管理方式&#xff1a;malloc/calloc/realloc/free 3. C內存管理方式 3…

DP學習——組合模式

學而時習之&#xff0c;溫故而知新。 組合模式 和代理模式相比 和代理模式相比&#xff0c;有點類似。引用類和被引用類都繼承于同一個接口類。 但是感覺組合模式是對代理模式的更加豐富化&#xff08;升級版、超進化&#xff09;&#xff0c;集合化或者說聚合化。 組合模…

拉格朗日乘子法和KKT條件

拉格朗日乘子法(Lagrange Multiplier) 和 KKT(Karush-Kuhn-Tucker) 條件是求解約束優化問題的重要方法&#xff0c;在有等式約束時使用拉格朗日乘子法&#xff0c;在有不等約束時使用 KKT 條件。當然&#xff0c;這兩個方法求得的結果只是必要條件&#xff0c;只有當目標函數…

ssrf復習(及ctfshow351-360)

1. SSRF 概述 服務器會根據用戶提交的URL發送一個HTTP請求。使用用戶指定的URL&#xff0c;Web應用可以獲取圖片或者文件資源等。典型的例子是百度識圖功能。 如果沒有對用戶提交URL和遠端服務器所返回的信息做合適的驗證或過濾&#xff0c;就有可能存在“請求偽造"的缺陷…

C#中錯誤與異常處理

1、錯誤和異常 如果程序運行期間發生錯誤&#xff0c;異常就會發生。異常會中止當前的程序流&#xff0c;如果不采取措施&#xff0c;程序將停止運行。 錯誤和異常是兩個不同的概念&#xff0c;但它們都與程序的穩定性和可維護性有關。 1.1、錯誤 錯誤通常是指編譯時的語法錯誤…

FPGA學習筆記(一) FPGA最小系統

文章目錄 前言一、FPGA最小系統總結 前言 今天學習下FPGA的最小系統一、FPGA最小系統 FPGA最小系統與STM32最小系統類似&#xff0c;由供電電源&#xff0c;時鐘電路晶振&#xff0c;復位和調試接口JTAG以及FLASH配置芯片組成&#xff0c;其與STM32最大的不同之處就是必須要有…

關于Hyperf高并發性能的一些配置詳解和硬件推薦

目錄 工作進程的管理 自定義配置示例&#xff08;EasySwoole&#xff09;&#xff1a; 自動生成&#xff1a; 結論&#xff1a; 集群部署與協程數的關系&#xff1a; 設置 max_coroutine 的考慮因素&#xff1a; 集群部署時的配置&#xff1a; 示例配置&#xff1a; C…

鏈表面試練習習題集(Java)

1. 思路&#xff1a; 因為楊輝三角是由二維數組構成&#xff0c;所以要先創建一個二維數組&#xff0c;如何用順序表表示二維數組&#xff0c;可以通過List<List<Interger>>來表示一個二維數組&#xff0c;可以這樣理解&#xff1a;先創建一個一維數組List&#x…

modbus slave 設備通過 網關thingsboard-gateway 將數據上傳到thingsboard云平臺

搭建thingsboard物聯網云平臺花了大量時間&#xff0c;從小白到最后搭建成功&#xff0c;折磨了好幾天&#xff0c;也感謝網友的幫助&#xff0c;提供了思路最終成功搞定&#xff0c;特此記錄。 一、thingsboard環境搭建&#xff08;Ubuntu20.04LTS&#xff09; 參考官方文檔&a…

java之 junit單元測試案例【經典版】

一 junit單元測試 1.1 單元測試作用 單元測試要滿足AIR原則&#xff0c;即 A&#xff1a; automatic 自動化&#xff1b; I: Independent 獨立性&#xff1b; R&#xff1a;Repeatable 可重復&#xff1b; 2.單元測試必須使用assert來驗證 1.2 案例1 常規單元測試 1.…

PSINS工具箱函數介紹——r2d

介紹工具箱里面r2d這個小函數的作用。 程序源碼 function deg r2d(rad) % Convert angle unit from radian to degree % % Prototype: deg r2d(rad) % Input: rad - angle in radian(s) % Output: deg - angle in degree(s) % % See also r2dm, r2dms, d2r, dm2r, dms2r% …

設計模式使用場景實現示例及優缺點(行為型模式——觀察者模式)

阿爾法的身體內部有一個智能芯片&#xff0c;這個芯片能夠根據環境和需求自動改變它的行為模式。當阿爾法需要完成不同任務時&#xff0c;它的內部狀態會發生變化&#xff0c;進而改變它的行為&#xff0c;就像是它變成了另一個機器人一樣。 一天&#xff0c;智能城的市長接到一…

多種方式實現 元素高度絲滑的從0-1顯示出來

選擇合適的方式&#xff0c;給用戶更好的體驗&#xff0c;多種方式實現 元素高度絲滑的從0-1顯示出來。 能用 CSS 實現的動畫&#xff0c;就不要采用 JS 去實現。 1、瀏覽器可以對CSS動畫進行優化&#xff0c;其優化原理類似于requestAnimationFrame&#xff0c;會把每一幀的…

java基礎學習:序列化之 - Fast serialization

在Java中&#xff0c;序列化是將對象的狀態轉換為字節流的過程&#xff0c;以便保存到文件、數據庫或通過網絡傳輸。Java標準庫提供了java.io.Serializable接口和相應的機制來進行序列化和反序列化。然而&#xff0c;標準的Java序列化機制性能較低&#xff0c;并且生成的字節流…

appium2.0 執行腳本遇到的問題

遇到的問題&#xff1a; appium 上的日志信息&#xff1a; 配置信息 方法一 之前用1.0的時候 地址默認加的 /wd/hub 在appium2.0上&#xff0c; 服務器默認路徑是 / 如果要用/wd/hub 需要通過啟動服務時設置基本路徑 appium --base-path/wd/hub 這樣就能正常執行了 方法二…

關于Kafka的17個問題

1.Kafka 的設計時什么樣的呢&#xff1f; Kafka 將消息以 topic 為單位進行歸納 將向 Kafka topic 發布消息的程序成為 producers. 將預訂 topics 并消費消息的程序成為 consumer. Kafka 以集群的方式運行&#xff0c;可以由一個或多個服務組成&#xff0c;每個服務叫做一個…

前端css常用筆記

文章目錄 一、樣式二、vue筆記2.1、組件之間的通信2.1.1 子組件調用父組件的方法2.1.2 父組件調用子組件的方法2.1.3 孫組件調用祖父組件方法的實現 2.2、使用若依時,node_nodules越來越大的問題2.3、echart筆記 一、樣式 1 文字與圖標對不齊的解決方法 /**給icon加上這個樣式即…

mysql的索引事務和存儲引擎

一、索引 1、索引 索引的概念 &#xff1a;索引是一個排序的列表&#xff0c;在列表當中存儲索引的值以及索引值對應數據所在的物理行。 索引的引用&#xff1a; 使用索引之后&#xff0c;就不需要掃描全表來定位某行的數據。 加快數據庫的查詢速度。 索引可以是表中的一…

ubuntu 網絡 通訊學習筆記2

1.ubuntu 網絡常用命令 在Ubuntu中&#xff0c;有許多網絡相關的常用命令。以下是一些主要命令及其用途&#xff1a; ifconfig&#xff1a;此命令用于顯示和配置網絡接口信息。你可以使用它來查看IP地址、子網掩碼、廣播地址等。 例如&#xff1a;ifconfig 注意&#xff1a…