摘要:學(xué)習(xí)正則表達(dá)式也是如此,循序漸進(jìn),方能厚積薄發(fā)。概念分組捕獲是指將想要匹配的正則表達(dá)式用小括號(hào)括起來(lái),然后與限定符組合使用,可以連續(xù)匹配符合規(guī)則的字符串。
正則表達(dá)式是一個(gè)非常有用的用來(lái)匹配驗(yàn)證字符串的工具。很多人覺(jué)得正則表達(dá)式規(guī)則繁多,學(xué)了也會(huì)忘記,不如等到需要使用的時(shí)候再去查閱即可。這樣的觀點(diǎn)也無(wú)可厚非,不過(guò)我曾經(jīng)看到過(guò)一個(gè)絕妙的關(guān)于閱讀的比喻,閱讀就像是將竹簍浸入到水里面,雖然撈打上來(lái)的時(shí)候竹簍里并沒(méi)有裝水,但是竹簍已經(jīng)被浸濕了。學(xué)習(xí)正則表達(dá)式也是如此,循序漸進(jìn),方能厚積薄發(fā)。
大綱◆ 常用的正則表達(dá)式
◆ 分組捕獲與后向引用
◆ 貪婪模式與非貪婪模式
◆ 應(yīng)用場(chǎng)景
常用的正則表達(dá)式 1.元字符元字符 | 釋義 |
---|---|
普通字符 | 如A-Z、a-z、0-9 等等 |
. | 除換行以外的其他任意字符, 如果需要匹配換行符,可用[.n] |
s | 空白字符 |
S | 除空白字符以外的任意字符 |
w | 字母、數(shù)字、下劃線 |
W | 除了字母、數(shù)字、下劃線以外的任意字符 |
d | 數(shù)字 0-9 |
D | 除了數(shù)字之外的任意字符 |
^ | 匹配輸入字符串開始的位置 |
$ | 匹配輸入字符串結(jié)尾的位置 |
b | 單詞邊界,匹配一個(gè)完整的單詞可以使用 bwordb |
以上是最常用的正則表達(dá)式匹配字符,當(dāng)然,還有很多其他的匹配元字符,比如 匹配制表符, 匹配回車符, 匹配換行符等。
以d為例,d代表數(shù)字0-9,等價(jià)于字符組[0-9]
例:匹配字符串 ‘fefafe332gt66ooj44nie85kk’ 中的所有數(shù)字
var str = "fefafe332gt66ooj44nie85kk" var reg = /d+/g console.log(str.match(reg)) // 結(jié)果為["332", "66", "44", "85"]2.限定符
限定符 | 釋義 |
---|---|
* | 0到無(wú)數(shù)次。例如,zo* 能匹配 "z" 以及 "zoo" |
+ | 1到無(wú)數(shù)次。例如,zo+ 不能匹配 “z” 但是能匹配 “zo”和“zoo” |
? | 0 或者1 次。例如,zo? 能匹配 “z”和 “zo” 但是不能匹配 “zoo” |
{n} | 匹配確定的N次。 例如, zo{2} 只能匹配到 zoo |
{n,} | 匹配n到無(wú)限次。 例如,zo{1,} 不能匹配“z” 但是能匹配“zo”和“zoo” |
{n,m} | 匹配n到m次。注意:在逗號(hào)和兩個(gè)數(shù)之間不能有空格 |
以上這些限定符,可以匹配指定個(gè)數(shù)的字符,在能夠匹配的范圍之內(nèi),盡可能多的匹配。其中{n,m}限定符有兩個(gè)注意點(diǎn):
n不能大于m
在逗號(hào)和兩個(gè)數(shù)之間不能有空格,否則無(wú)法匹配
例:匹配38到288之間的數(shù)
let reg = /((38|39)|([4-9]d)|(1d{2})|(2[0-7]d)|(28[0-8]))/g let str = "45 454 255 288 38 88 11 37 100 109 28 000 289 209" console.log(str.match(reg)) // ["45", "255", "288", "38", "88", "100", "109", "209"]3.修飾符
修飾符 | 釋義 |
---|---|
g | global 全局搜索 (不添加 搜索到第一個(gè)匹配停止) |
i | ignore case 忽略大小寫 |
m | multiline 多行匹配 |
m多行匹配用得相對(duì)較少,但是也有一定用處。
例:對(duì)比m和mg
var str8 = "abeifenabc abpheeabc" var reg8a = /^ab/gm var reg8b = /^ab/g console.log(str8.match("gm:"+reg8a)) // 結(jié)果為:["ab", "ab"] console.log(str8.match("g:"+reg8b)) // 結(jié)果為:["ab"]
上面三個(gè)修飾符最常用。當(dāng)然,還有其他修飾符,比如A表示強(qiáng)制從目標(biāo)字符串開頭匹配,x表示將模式中的空白忽略。
4.其他常用符號(hào) | 釋義 | |
---|---|---|
分支符號(hào)" | " | 用來(lái)匹配指定幾個(gè)規(guī)則中的一個(gè) |
轉(zhuǎn)義符號(hào)"" | 用于匹配"[""^""+"")"等有特殊含義符號(hào) | |
字符組 [] | 用于匹配指定范圍之內(nèi)的任意一個(gè)字符 |
例如:表達(dá)式 [cChH]at 可以只能匹配到 cat、Cat、hat、Hat 四個(gè)字符串中的一個(gè)
例:敏感詞過(guò)濾。比如:“我草你媽哈哈背景天胡景濤哪肉涯剪短發(fā)欲望”,過(guò)濾:"草肉欲胡景濤"
let str9 = "我草你媽哈哈背景天胡景濤哪肉涯剪短發(fā)欲望"; let regExp = /草|肉|欲|胡景濤/g; let result = str9.replace(regExp, function(match) { let len = match.length; let str; switch (len) { case 1: str = "*"; break; case 2: str = "**"; break; case 3: str = "***"; break; default: str = "****"; } return str; }); console.log(result); //我*你媽哈哈背景天***哪*涯剪短發(fā)*望分組捕獲與后向引用 1.分組捕獲
當(dāng)我們想要匹配多個(gè)字符的時(shí)候,可以使用限定符來(lái)指定個(gè)數(shù),那當(dāng)我們需要匹配多個(gè)字符串的情況,該怎么辦呢?可以使用分組捕獲。
概念:
分組捕獲是指將想要匹配的正則表達(dá)式用小括號(hào)括起來(lái),然后與限定符組合使用,可以連續(xù)匹配符合規(guī)則的字符串。每一個(gè)小括號(hào)代表的表達(dá)式分為一組,作為子表達(dá)式,后期可以通過(guò)捕獲不同組的內(nèi)容來(lái)進(jìn)行替換等操作。
例:匹配字符串isuwang連續(xù)出現(xiàn)3次的情況
isuwang{3}
(isuwang){3}
可以看到,下面一組例子將isuwang字符串當(dāng)作一個(gè)組,整體匹配了3次。
2.非捕獲分組分組捕獲的缺點(diǎn):
有些不得不用()但是后期又不會(huì)用到的子表達(dá)式內(nèi)容,記錄在組里面會(huì)占用內(nèi)存,降低匹配效率
解決:
使用非捕獲組。只進(jìn)行分組,并不將子表達(dá)式匹配到的內(nèi)容捕獲到組里。
字符 | 描述 | 示例 | |||
---|---|---|---|---|---|
(?:pattern) | 匹配pattern,但不捕獲匹配結(jié)果。 | ‘industr(?:y | ies)匹配"industry"或"industries" | ||
(?=pattern) | 零寬度正向預(yù)查,不捕獲匹配結(jié)果。 | "Windows (?=95 | 98 | NT | 2000)"匹配 "Windows2000" 中的 "Windows",不匹配 "Windows3.1" 中的 "Windows"。 |
(?!pattern) | 零寬度負(fù)向預(yù)查,不捕獲匹配結(jié)果。 | "Windows (?!95 | 98 | NT | 2000)"匹配 "Windows3.1" 中的 "Windows"不匹配 "Windows2000" 中的 "Windows"。 |
(?<=pattern) | 零寬度正向回查,不捕獲匹配結(jié)果。 | "2000 (?<=Office | Word | Excel)"匹配 " Office2000" 中的 "2000",不匹配 "Windows2000" 中的 "2000"。 | |
(? | 零寬度負(fù)向回查,不捕獲匹配結(jié)果。 | "2000 (? | Word | Excel)"匹配 " Windows2000" 中的 "2000",不匹配 " Office2000" 中的 "2000"。 |
使用情況:
一般只有在比較復(fù)雜,“()”使用較多的情況下會(huì)考慮使用非捕獲組。比如驗(yàn)證日期的正則表達(dá)式。
對(duì)比:
未使用非捕獲組的正則
^((?!0000)[0-9]{4}-((0[1-9]|1[0-2])-(0[1-9]|1[0-9]|2[0-8])|(0[13-9]|1[0-2])-(29|30)|(0[13578]|1[02])-31)|([0-9]{2}(0[48]|[2468][048]|[13579][26])|(0[48]|[2468][048]|[13579][26])00)-02-29)$
使用了非捕獲組的正則:
^(?:(?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)$3.后向引用
作用:
后向引用用于重復(fù)搜索前面某個(gè)分組匹配的文本。例如,1 代表分組1匹配的文本,也可以用$1來(lái)表示
說(shuō)明:
子分組捕獲的內(nèi)容可在正則表達(dá)式里面或者其他文本里面作進(jìn)一步的處理。默認(rèn)情況下,從左向右,以分組的左括號(hào)為標(biāo)志,第一個(gè)出現(xiàn)的分組的組號(hào)為1,第二個(gè)為2,以此類推。也可以使用命名分組的方式,對(duì)每個(gè)分組進(jìn)行命名。
例:檢查重復(fù)字符串
給定字符串 str,檢查其是否包含連續(xù)重復(fù)的字母(a-zA-Z),包含返回 true,否則返回false
let str4 = "abccdefgjhiss" let reg4a = /([a-zA-Z])1/g let reg4b = /([a-zA-Z]){2}/g console.log(str4.match(reg4a)) // ["cc", "ss"] console.log(str4.match(reg4b)) // ["ab", "cc", "de", "fg", "jh", "is"]4.貪婪模式和非貪婪模式
貪婪模式:
在整個(gè)表達(dá)式匹配成功的前提下,盡可能多的匹配
非貪婪模式:
整個(gè)表達(dá)式匹配成功的前提下,盡可能少的匹配。非貪婪模式只被部分NFA引擎所支持。
量詞:
貪婪模式 | 非貪婪模式 |
---|---|
{m,n} | {m,n}? |
{m,} | {m,}? |
? | ?? |
* | *? |
+ | +? |
例子:
提取兩個(gè)""中的子串,其中不能再包含""
字符串:"The colleagues in "kuaisuwang" are very "diligent" and united"
錯(cuò)誤解法(通過(guò)非貪婪匹配)
let str6=""The colleagues in "isuwang" are very "diligent" and united"" let reg6a=/".*?" /g // 注意"后面還有個(gè)空格 console.log(str6.match(reg6a)) // ?[""The colleagues in "isuwang" ", ""diligent" "]
正確解法(通過(guò)貪婪模式匹配)
let str6=""The colleagues in "isuwang" are very "diligent" and united"" let reg6b=/"[^"]*" /g // 注意"后面還有個(gè)空格 console.log(str6.match(reg6b)) //[""isuwang" ", ""diligent" "]總結(jié)
此篇文章主要講述了常用的正則表達(dá)式符號(hào),以及分組和后向引用,貪婪模式和非貪婪模式兩種模式,這些知識(shí)點(diǎn)呢,在工作當(dāng)中會(huì)非常有用。至于正則表達(dá)式在我工作中的運(yùn)用,我放在下一篇來(lái)跟大家進(jìn)行分享。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/99685.html
摘要:定義在中,定義一個(gè)正則表達(dá)式有兩種方式,一種是直接量,另一種是使用構(gòu)造函數(shù)。元字符在正則表達(dá)式的模式中,有一些字符是有特殊含義的,被稱為元字符,如果要匹配元字符,則必須對(duì)其進(jìn)行轉(zhuǎn)義。正則表達(dá)式詳解二 簡(jiǎn)介 先來(lái)一段介紹: 正則表達(dá)式,又稱正規(guī)表示法、常規(guī)表示法(英語(yǔ):Regular Expression,在代碼中常簡(jiǎn)寫為regex、regexp或RE),計(jì)算機(jī)科學(xué)的一個(gè)概念。...
摘要:正則表達(dá)式可以用于搜索編輯和操作文本。模式分組后會(huì)在正則表達(dá)式中創(chuàng)建反向引用。使正則忽略大小寫。注意方法不支持正則表達(dá)式。第三步,通過(guò)匹配對(duì)象,根據(jù)正則表達(dá)式操作字符串。正則表達(dá)式匹配數(shù)字范圍時(shí),首先要確定最大值與最小值,最后寫中間值。 版權(quán)聲明:本文由吳仙杰創(chuàng)作整理,轉(zhuǎn)載請(qǐng)注明出處:https://segmentfault.com/a/1190000009162306 1. 正則表...
摘要:正則的三種方法編譯正則表達(dá)式。返回找到的值,并確定其位置。規(guī)定匹配的類型。用于全局匹配,用于區(qū)分大小寫,用于全局區(qū)分大小寫的匹配。非貪婪匹配就是匹配到結(jié)果就好,就少的匹配字符。對(duì)象是否具有標(biāo)志。正則表達(dá)式的源文本。 對(duì)正則的深入學(xué)習(xí) 學(xué)習(xí)正則我們不能光看看幾個(gè)修飾符就可以了,因?yàn)檎齽t還有許多深入的知識(shí),下面我就來(lái)為大家扒一扒。。。showImg(https://segmentfault...
摘要:最近深入研讀了正則表達(dá)式的一本經(jīng)典著作,對(duì)于在中使用正則表達(dá)式時(shí)使用反斜線轉(zhuǎn)義功能時(shí)有些心得,特與大家分享。核心思想在中使用正則表達(dá)式時(shí)要切記反斜線具有兩層轉(zhuǎn)義功能,如果你要匹配一個(gè)反斜線本身時(shí)要注意它必須被轉(zhuǎn)義兩次。 最近深入研讀了正則表達(dá)式的一本經(jīng)典著作,對(duì)于在python中使用正則表達(dá)式時(shí)使用反斜線轉(zhuǎn)義功能時(shí)有些心得,特與大家分享。 核心思想:在python中使用正則表達(dá)式時(shí)要...
摘要:下面整理一些常用的正則表達(dá)式。正則表達(dá)式中可以使用編碼。每個(gè)正則表達(dá)式可帶有一個(gè)或者多個(gè)標(biāo)注用以標(biāo)明正則表達(dá)式的行為。其中表示匹配項(xiàng)在字符串中的位置,而表示應(yīng)用字符串表達(dá)式的字符串。 正則表達(dá)式非常有用,查找、匹配、處理字符串、替換和轉(zhuǎn)換字符串,輸入輸出等。下面整理一些常用的正則表達(dá)式。 常用的正則字符 正則字符 描述 :將下一個(gè)字符標(biāo)記為一個(gè)特殊字符、或一個(gè)原義字符、或一個(gè) 向...
摘要:正則表達(dá)式中可以使用編碼。每個(gè)正則表達(dá)式可帶有一個(gè)或者多個(gè)標(biāo)注用以標(biāo)明正則表達(dá)式的行為。其中表示匹配項(xiàng)在字符串中的位置,而表示應(yīng)用字符串表達(dá)式的字符串。方法正則表達(dá)式常用方法,它接受一個(gè)字符串參數(shù)。 正則表達(dá)式非常有用,查找、匹配、處理字符串、替換和轉(zhuǎn)換字符串,輸入輸出等。下面整理一些常用的正則表達(dá)式。 常用的正則字符 正則字符 描述 將下一個(gè)字符標(biāo)記為一個(gè)特殊字符、...
閱讀 2699·2023-04-25 17:21
閱讀 2563·2021-11-23 09:51
閱讀 2856·2021-09-24 10:32
閱讀 3782·2021-09-23 11:33
閱讀 1981·2019-08-30 15:44
閱讀 3461·2019-08-30 11:18
閱讀 3535·2019-08-30 10:53
閱讀 632·2019-08-26 13:25