正則表達式(?=a)是什么意思


(?=a) 代表什么意思!

(?=a)非獲取匹配,正向肯定預查,在任何匹配pattern的字符串開始處匹配查找字符串,該匹配不需要獲取供以后使用。

還有四個和這個相近的:

(?!a)非獲取匹配,正向否定預查,在任何不匹配pattern的字符串開始處匹配查找字符串,該匹配不需要獲取供以后使用。
(?:a)非獲取匹配,匹配pattern但不獲取匹配結果,不進行存儲供以后使用。這在使用或字符“(|)”來組合一個模式的各個部分是很有用。
(?<=a)非獲取匹配,反向肯定預查,與正向肯定預查類似,只是方向相反。
(?<!a)非獲取匹配,反向否定預查,與正向否定預查類似,只是方向相反。

以上是官方的定義,比較難懂,我用自己的理解翻譯了一下:

(?=a) 表示我們需要匹配某樣東西的前面。 
(?!a) 表示我們需要不匹配某樣東西。 
(?:a) 表示我們需要匹配某樣東西本身。 
(?<=a) 表示我們需要匹配某樣東西的后面。 
(?<!a) 表示我們需要不匹配某樣東西,與(?!a)方向相反。

我的翻譯可能還是不太容易理解,我們用代碼來解釋一下!

console.log("我是中國人".replace(/我是(?=中國)/, "rr")) // 輸出: 'rr中國人',匹配的是中國前面的'我是'

console.log("我是中國人".replace(/(?!中國)/, "rr")) // 輸出:'rr我是中國人'

console.log("我是中國人".replace(/(?:中國)/, "rr")) // 輸出:'我是rr人',匹配'中國'本身

console.log("我是中國人".replace(/(?<=中國)人/, "rr")) // 輸出:'我是中國rr',匹配的是中國后面的'人'

console.log("我是中國人".replace(/(?<!中國)/, "rr")) // 輸出:'rr我是中國人'

Tips:(?!a)和(?<!a)都是輸出的 'rr我是中國人',我的理解是,replace替換的時候匹配得是不包含中國的字符串,但是這個字符串又沒有,那么js自動給加前面去了。

一些正則需要知道的概念

【分組】:

如果你想要在正則中重復匹配一個字符串,那么可以用一個 () 號給包起來,官方得說法是指定子表達式,也就是分組!

用代碼解釋就是:

\d{1,3}  // 表示匹配1到3位的數字

(\d{1,3}\.){3}  // 表示匹配三位數字加上一個英文句號,並且把這個分組(也就是這個匹配規則)重復三次

理解了分組這個概念,再復雜的表達式也可以拆分成幾個細的分組來實現。

【后向引用】:

用 () 號創建了一個分組后,匹配這個子表達式的文本可以在表達式或其它程序中作進一步的處理。每個分組會自動擁有一個組號,規則是:從左向右,以分組的左括號為標志,第一個出現的分組的組號為1,第二個為2,以此類推。

如果你要重復搜索前面某個分組匹配的文本,可以用 \1 ,含義是,分組1匹配的文本,這種引用方式叫做后向引用。

用代碼解釋一下:

console.log("oh oh , oh my god!".replace(/\b(\w+)\b\s+\1\b/, "rr"))

// 輸出:'rr , oh my god!'

// \b 匹配一個單詞邊界,一側為單詞的字符,另外一側為非單詞字符

// \b(\w+)\b,匹配單詞開始處和結束處之間的多於一個的字母或數字

// \s+ 匹配一個或者多個空格

// \1 后向引用,重復一次 

// 如果正則表達式去掉 \1

console.log("oh oh , oh my god!".replace(/\b(\w+)\b\s+/, "rr"))

// 輸出:'rroh , oh my god!'

實際使用

 數字格式化

console.log("1234567890".replace(/\B(?=(?:\d{3})+(?!\d))/g,",")) 

// 輸出:'1,234,567,890'

去除ip地址

console.log("192.168.0.1".replace(/((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)/,"rr"))

// 輸出:'rr'

去除字符串中的中文,英文或者數字

console.log("aaa我是中國人111".replace(/[^u4E00-u9FA5]/g, ""))  // 去除中文,輸出:'aaa111'

console.log("aaa我是中國人111".replace(/(\d)\1+/g, ""))  // 去除數字,輸出:'aaa我是中國人'

console.log("aaa我是中國人111".replace(/([a-z])\1+/g, "")) // 去除英文,輸出:'我是中國人111'

正則表達式規則表

 

來源:https://juejin.cn/post/6844903855243657230


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM