元字符:在正則表達(dá)式中有特殊語(yǔ)義的字符
常用元字符 | 含義 |
---|---|
. | 匹配除換行符以外的任何字符 |
\w | 匹配字母刁笙、數(shù)字、下劃線 |
\W | 匹配不是字母、數(shù)字拍鲤、下劃線的字符 |
\d | 匹配數(shù)字, 相當(dāng)于[0-9] |
\D | 匹配不是數(shù)字的字符 |
\s | 匹配任何不可見(jiàn)字符剩檀,包括空格憋沿、制表符、換行符等 |
\S | 匹配任意可見(jiàn)字符 |
\b | 匹配一個(gè)詞的邊界沪猴。一個(gè)詞的邊界就是沒(méi)有其他“字”字符在其前面或后面的位置 |
\B | 匹配不是詞的邊界 |
^ | 匹配字符串的開(kāi)始位置 |
$ | 匹配字符串的結(jié)束位置 |
這里的\w和\W以及\d和\D等都是互斥等辐啄,組合起來(lái)就是字符等全集,但跟 . 不相等运嗜,因?yàn)?. 不包括換行符壶辜。
字符集:使用[] 括起字符串來(lái)創(chuàng)建字符集,可以匹配[]里面的任意字符
一些特殊符號(hào)在字符集中是沒(méi)有特殊語(yǔ)義的担租,不需要用轉(zhuǎn)義符轉(zhuǎn)義砸民,例如:
[.*+?^=!:${}()|[]/\],但如果不在字符集中是需要轉(zhuǎn)義的翩活,比如 /./表示匹配除換行符之外的任何字符 , 如果想匹配 . 字符本身阱洪,就需要:/\./
.
一些元字符也可以用字符集來(lái)表示,比如:\d == [0-9] \w == [0-9A-Za-z_].
'-' 短橫線在字符集中表示區(qū)間菠镇,如果只有 ‘-’ 一個(gè)字符冗荸,就可以匹配'-' 不需要轉(zhuǎn)義
/[-]/.test('-'); // true
/[-a]/.test('-') // true
/[a-]/.test('-') // true
分支: 其實(shí)就是表示或的概念
(aa|ba|ca): 匹配aa, ba或ca,這個(gè)也可以用字符集表示:/[abc]a/, 這種特殊情況可以這樣表示利耍,但是像(aa|bb|cc)這種就不可以了
量詞:表示字符重復(fù)次數(shù)
常用元字符 | 含義 |
---|---|
* | 重復(fù)任意次蚌本,相當(dāng)于{0,} |
? | 重復(fù)0次或1次盔粹,相當(dāng)于{0,1} |
+ | 重復(fù)一次或更多次,相當(dāng)于{1,} |
{n} | 重復(fù)n次 |
{n,} | 重復(fù)n次或更多次 |
{n,m} | 重復(fù)n到m次 |
分組和引用
分組:使用()將字符作為一個(gè)最小單元程癌,并且可以記住匹配項(xiàng)
引用:可以使用反斜杠‘\’來(lái)引用分組的表達(dá)式舷嗡,從最外層的括號(hào)開(kāi)始計(jì)算分組,依次為分組一嵌莉、分組二...
上面圖片已經(jīng)確定了分組进萄,接下來(lái)我們就可以使用引用了
/(\d{4})-(\d{2})-\2/:\2 就表示引用 (\d{2}) 的內(nèi)容,和 (\d{2}) 的內(nèi)容相同
/(\d{4})-(\d{2})-\2/.test('2018-07-07') // true
/(\d{4})-(\d{2})-\2/.test('2018-07-09') // false
\1, \2, \n
這種是用在正則表達(dá)式的匹配環(huán)節(jié)锐峭,但是這種123的記法不方便中鼠,你還得一個(gè)個(gè)去數(shù)。有一種給分組命名的方法可以方便記憶: ?<name>沿癞,訪問(wèn)捕獲的組可以使用 \k<name>援雇。在正則表達(dá)式的替換環(huán)節(jié),則要使用像 $1椎扬、$2...$9
這樣的語(yǔ)法惫搏,$&
可以匹配全部?jī)?nèi)容,而不只是分組內(nèi)容蚕涤。
groups字段中展示了各個(gè)捕獲組的內(nèi)容筐赔。
/(?<year>\d{4})-(?<month>\d{2})-\k<month>/.test('2018-08-08') // true
零寬斷言:匹配到的內(nèi)容不保存到匹配結(jié)果中去
作用是給指定位置添加一個(gè)限定條件,用來(lái)規(guī)定此位置之前或者之后的字符必須滿足限定條件才能使正則中的子表達(dá)式匹配成功揖铜。
- 根據(jù)方向到不同川陆,分為lookahead(向前查找)和lookbehind(向后查找)
- 根據(jù)判定原則,分為 肯定和否定
從左到右/pattern的前面位置 | 從右到左/pattern的后面位置 | |
---|---|---|
肯定/正 | (?=pattern)(子字符串前面有pattern才會(huì)匹配) | (?<=pattern) (子字符串后面有pattern才會(huì)匹配) |
否定/負(fù) | (?!pattern)(子字符串前面沒(méi)有pattern才會(huì)匹配) | (?<!pattern) (子字符串后面沒(méi)有pattern才會(huì)匹配) |
向后看是有個(gè)<
蛮位,肯定=
, 否定!
惰性&貪婪
貪婪模式:在匹配成功的情況下鳞绕,盡可能多的去匹配
比如:/.*bbb/g.test(‘a(chǎn)bbbaabbbaaabbb1234')
*會(huì)先盡可能多的匹配失仁,這里就是匹配全部字符串,然后再查找b们何,如果不符合條件就向前回溯萄焦,匹配'abbbaabbbaaabbb123', 再向后查找b,不滿足繼續(xù)回溯...
惰性模式:在匹配成功的情況下冤竹,盡可能少的去匹配
比如:/.*?bbb/g.test(‘a(chǎn)bbbaabbbaaabbb1234’)
*會(huì)盡量少的匹配拂封,第一次會(huì)匹配0次,然后向后查找b
到底是使用貪婪模式還是惰性模式要看自己對(duì)所要匹配對(duì)字符串的熟悉程度鹦蠕,對(duì)字符串的特性越熟悉冒签,越容易判定使用哪種模式,自然也能提升性能钟病。
貪婪要不停的回溯萧恕,惰性則是從前往后匹配
修飾符
修飾符 | 含義 |
---|---|
i | ignoreCase(忽略大小寫(xiě)) |
g | global(全局) |
m | multiline(多行) |
s | dotAll(. 能匹配所有字符) |
y | sticky(粘連) |
m
表示匹配多行刚梭,主要是表達(dá)式加^
時(shí)會(huì)有差別,每次都從每一行的開(kāi)頭匹配
'1\n2'.match(/^\d/g) // ["1"]
'1\n2'.match(/^\d/mg) // ["1", "2"] 注意要加上g
藏雏,匹配全局巡语,不然結(jié)果也只是 1
s
: . 表示除換行之外的所有字符盾舌,加上s
修飾符就可以表示所有字符
/./.test('\n') // false
/./s.test('\n') // true
使用方法
方法 | 描述 |
---|---|
exec | 在字符串中執(zhí)行查找匹配,返回一個(gè)數(shù)組(沒(méi)匹配到返回null) |
test | 測(cè)試字符串是否匹配衅金,返回true或false |
match | 在字符串中執(zhí)行查找匹配的String方法,返回?cái)?shù)組或null |
search | 在字符串中測(cè)試匹配的String方法簿煌,返回匹配到的位置索引或-1 |
replace | 在字符串中執(zhí)行查找匹配的String方法氮唯,并用替換字符串替換掉匹配到的字符串 |
split | 使用正則表達(dá)式或字符串分割字符串,并將分割后的結(jié)果存儲(chǔ)到數(shù)組中的String方法 |
match和exec的區(qū)別除了一個(gè)是String方法一個(gè)是RegExp方法啦吧,還有就是有g
修飾符時(shí)候的表現(xiàn)
- 無(wú)子表達(dá)式
'abbbaabbbaaabbb1234'.match(/ab/g) // ["abbb", "a", "abbb", "a", "a", "abbb"]
/ab/g.exec('abbbaabbbaaabbb1234') // ["abbb", index: 0, input: "abbbaabbbaaabbb1234", groups: undefined] (返回第一個(gè)匹配的字符串內(nèi)容) - 有子表達(dá)式
'abbbaabbbaaabbb1234'.match(/a(a)/g) // ["a", "aa", "aaa"] (忽略子表達(dá)式您觉,只查找全匹配正則表達(dá)式并返回所有內(nèi)容)
/a(a)/g.exec('abbbaabbbaaabbb1234') // ["a", "", index: 0, input: "abbbaabbbaaabbb1234", groups: undefined]