記一次面試題,正則表達式(?=a)是什麼意思?

前言

不久前出去面試了一下,被問到了一個問題:html

正則表達式 (?=a) 表示什麼意思?面試

嗯,我花了幾秒鐘從腦子中檢索答案,而後發現對於正則表達式方面的知識有許多地方記不清了!正則表達式

so,個人回答是:bash

我只知道 ? 號是最少匹配前面一次的意思,加個 = 號就不太清楚了,是最少匹配一次 = 號後面的值的嗎?spa

面了三輪後,告知我待定!翻譯

對於面試,我也算是身經百戰了,待定的意思我明白,意思就是工做的內容能勝任,但我還要看看後面來面試的是否是有比你更好的。code

獲得這個結果後,我本身想了一下,是否是我面試中關於這個正則的回答沒回答好!cdn

因而,爲了之後出去面試,從一個待定人士變爲非你不可,我在本身研究加上請教一些網上朋友後,對於正則表達式有了些許體會。htm

寫篇文章總結下。blog

(?=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'
複製代碼

如下省略一萬個實際例子 ...

正則表達式規則表

結束

不研究不知道,一研究,發現正則表達式裏面能夠玩的東西太多了,篇幅和能力都有限,只能先到這裏了,有什麼錯漏之處歡迎各位大大指出!

參考:正則 ?<= 和 ?= 用法

相關文章
相關標籤/搜索