正則表達(dá)式中?=和?:和?!的理解

要理解?=和?!,首先需要理解前瞻,后顧,負(fù)前瞻,負(fù)后顧四個(gè)概念:

// 前瞻:
exp1(?=exp2) 查找exp2前面的exp1
// 后顧:
(?<=exp2)exp1 查找exp2后面的exp1
// 負(fù)前瞻:
exp1(?!exp2) 查找后面不是exp2的exp1
// 負(fù)后顧:
(?<!exp2)exp1 查找前面不是exp2的exp1

舉例:

"中國人".replace(/(?<=中國)人/, "rr") // 匹配中國人中的人,將其替換為rr,結(jié)果為 中國rr
"法國人".replace(/(?<=中國)人/, "rr") // 結(jié)果為 法國人,因?yàn)槿饲懊娌皇侵袊詿o法匹配到

要理解?:則需要理解捕獲分組和非捕獲分組的概念:

()表示捕獲分組,()會(huì)把每個(gè)分組里的匹配的值保存起來,使用$n(n是一個(gè)數(shù)字,表示第n個(gè)捕獲組的內(nèi)容)
(?:)表示非捕獲分組,和捕獲分組唯一的區(qū)別在于,非捕獲分組匹配的值不會(huì)保存起來

舉例:

// 數(shù)字格式化 1,123,000
"1234567890".replace(/\B(?=(?:\d{3})+(?!\d))/g,",") 
// 結(jié)果:1,234,567,890,匹配的是后面是3*n個(gè)數(shù)字的非單詞邊界(\B)

正則表達(dá)式的() [] {} 有著不同的意思。

() 是為了提取匹配字符串的,表達(dá)式中有幾個(gè)()就有幾個(gè)相應(yīng)的匹配字符串
(\s)表示連續(xù)空格的字符串
[] 是定義匹配的字符范圍。比如[a-zA-Z0-9]表示相應(yīng)位置的字符要匹配英文字符和數(shù)字。[\s
表示空格或者號(hào)]
{}一般是用來匹配的長度。比如\s{3}表示匹配三個(gè)空格,\s[1,3]表示匹配1到3個(gè)空格
(0-9)匹配'0-9'本身。[0-9]
匹配數(shù)字(注意后面有*,可以為空)[0-9]+匹配數(shù)字(注意后面有+,不可以為空),
{0-9}寫法是錯(cuò)誤的
[0-9]{0,9}表示長度為0到9的數(shù)字字符串。

圓括號(hào)()是組,主要應(yīng)用在限制多選結(jié)構(gòu)的范圍/分組/捕獲文本/環(huán)視/特殊模式處理

示例:

1(abc|bcd|cde),表示這一段是abc、bcd、cde三者之一,順序也必須一致
2、(abc)? 表示這一組要么一起出現(xiàn),要么不出現(xiàn),出現(xiàn)那則按順序出現(xiàn)
3、(?:abc)表示找到一樣abc的一組,但是不記錄,不保存到變量中,否則可以通過變量中,否則可以通過x取第幾個(gè)括號(hào)所匹配道德項(xiàng),比如:
(aaa)(bbb)(ccc)(?:ddd)(eee)可以用1獲取(??????)匹配到的內(nèi)容,而1獲取(aaa)匹配到的內(nèi)容,而3則獲取到了(ccc)匹配到的內(nèi)容,而$4則獲取的是由(eee)匹配到的內(nèi)容,因?yàn)榍耙粚?duì)括號(hào)沒有保存變量
4.a(?=bbb)順序環(huán)視 表示a后面必須緊跟3個(gè)連續(xù)的b
5、(?i:xxxx)不區(qū)分大小寫   (?s:.*)跨行匹配,可以匹配回車符

方括號(hào)是單個(gè)匹配 字符集/排除字符集/命名字符集

示例:

1、[0-3],表示找到一個(gè)位置上的字符只能是0到3折四個(gè)數(shù)字,與(abc|bcd|cde)的作用比較類似,但圓括號(hào)可以匹配多個(gè)連續(xù)的字符
而一對(duì)方括號(hào)只能匹配單個(gè)字符
2、[^0-3] 表示找到這個(gè)位置上字符只能是除了0到3之外的所有字符
3、[:digit:] 0-9 [:alnum] A-Za-z0-9


()和[]有本質(zhì)的區(qū)別

()內(nèi)的內(nèi)容表示的是一個(gè)表達(dá)式,()本身不匹配任何東西,也不惜那是匹配任何東西,只是把括號(hào)內(nèi)的內(nèi)容作為

同一個(gè)表達(dá)式來處理,例如(ab){1,3},就表示ab一起連續(xù)出現(xiàn)最少1次,最多三次。如果沒有括號(hào)的話,ab{1,3},

就表示a 后面緊跟的b出現(xiàn)的最少一次,最多三次。另外,括號(hào)在匹配模式中也跟重要。這個(gè)就不延伸了。

[]表示匹配字符在[]中,兵出現(xiàn)一次,并且reshuffle字符寫在[]會(huì)被當(dāng)成普通字符來匹配,例如[(a)],會(huì)匹配(、a、)、這三個(gè)字符。

所以()[] 無論是作用還是表示的含義。都有天壤之別,沒有什么聯(lián)系。

版權(quán)聲明:本文為CSDN博主「這個(gè)昵稱沒有被占用吧」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/csm0912/article/details/81206848

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容