正則表達式預查的詳細解釋與應用實例

解釋

預查又稱環視(Lookaround)、屬於零寬斷言(Zero-Length Assertions)的一種,有 4 個語法:

語法 中文名 英文名
(?=regex) 肯定性前瞻 Positive lookahead
(?!regex) 否定性前瞻 Negative lookahead
(?<=regex) 肯定性後顧 Positive lookbehind
(?<!regex) 否定性後顧 Negative lookbehind

比較通俗的解釋:

  • 肯定性:匹配 regex
  • 否定性:不匹配 regex
  • 前瞻:向前(右、正向)看(預查)
  • 後顧:向後(左、反向)看(預查)
  • 肯定性前瞻:先看看前方(右邊)是否匹配 regex,但不向前走
  • 否定性前瞻:先看看前方(右邊)是否不匹配 regex,但不向前走
  • 肯定性後顧:回頭看後方(左邊)是否匹配 regex
  • 否定性後顧:回頭看後方(左邊)是否不匹配 regex

為什麼右邊是正向、前向,左邊是反向、後向?

因為正則是從左往右匹配的,就像一個人在走,那麼向前看(前瞻)就是右邊、正向,向後看(後顧)就是左邊、反向,特別註意不要和前綴後綴搞混

應用

1、判斷是否同時包含但不限於大寫字母、小寫字母和數字,且不能包含 114514,長度為 8~32 個字符

/^(?=.*[A-Z])(?=.*[a-z])(?=.*\d)(?!.*114514).{8,32}$/.test('[email protected]')
// true

2、判斷不以 8082848688 開頭

/^(?!8[02468])\d+$/.test('81789110')
// true

3、匹配由空白分割的字符串中的純數字串

'123 abc   1st\r\n4   1970\'s 56 @10086 789'.match(/(?<!\S)\d+(?!\S)/g)
// ['123', '4', '56', '789']
'123 abc   1st\r\n4   1970\'s 56 @10086 789'.match(/(?<=^|\s)\d+(?=\s|$)/g)
// ['123', '4', '56', '789']

4、僅刪除夾在數字中的逗號

'And then, I have 1,003,334, you have 996,6,6,6'.replace(/(?<=\d),(?=\d)/g, '')
// 'And then, I have 1003334, you have 996666'

5、在數字中添加分組逗號

'And then, I have 1003334, you have 996666'.replace(/(?<=\d)(?=(?:\d{3})+(?!\d))/g, ',')
// 'And then, I have 1,003,334, you have 996,666'

6、判斷是否僅包含字母,但不包含小寫元音字母

/^(?:(?![aeiou])[A-Za-z])+$/g.test('src')
// true
/^(?=[A-Za-z]+$)[^aeiou]+$/g.test('src')
// true

7、判斷是否是字母或數字或字母+數字,不能為空

/^(?=.)[a-z]*\d*$/i.test('Add1')
// true

8、匹配長度為 11 的號碼,註意不能是其他號碼的子串

`name:123456789
id:11012345678910
tel:12345678910
name:abc11111111111
id:888888888888
tel:11966`.match(/(?<!\d)\d{11}(?!\d)/g)
// ['12345678910', '11111111111']

9、如果缺少協議前綴,則添加 http://,忽略空行

String.raw`segmentfault.com
//bing.com
\baidu.com

127.0.0.1
ftp://127.0.0.1

https://google.com

`.replace(/^(?![a-z]+:)[\\/]*(?=.)/gim, 'http://')
/*
http://segmentfault.com
http://bing.com
http://baidu.com

http://127.0.0.1
ftp://127.0.0.1

https://google.com

*/

難點-為什麼.?[^#/n]?.*?不行

  • .?[^#/n]?.*?<VirtualHost
  • .?[^#/n]?相當於無,最後的.*?又匹配上瞭#號
  • (?<!.?#.?)來說就是一個整體,所有滿足要求

總結 

到此這篇關於正則表達式預查的詳細解釋與應用的文章就介紹到這瞭,更多相關正則表達式預查內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: