JS正則裡面“?”的用處

blank

JS正則裡面“?”的用處

限定符

匹配前面的子表達式零次或一次,0或1,可以使用{0,1}代替

舉例:

在平常webpack的rules配置中,用來匹配ts和tsx文件

{test:/.tsx?$/}

非貪婪匹配

能匹配少的就不匹配多的原則

舉例:

查找字符串的數字,如果有3個數字連在一起,就直接匹配

const str = 'sd2345s423987sd2342' str . match ( /d{3,5}?/g ) // 因为增加了"?"符合,导致只要有符合3个连续数字的就返回。 // ["234", "423", "987", "234"] str . match ( /d{3,5}/g ) // 去掉"?"后,变成了默认模式,就是贪婪匹配// ["2345", "42398", "2342"]

查找img全標籤

const str = '<img class="latex" style="width:2.323ex; height:2.009ex; vertical-align: -0.171ex;" src="https://td.com/1.png" /><span>s</span>' str . match ( /<img.*?/?>/g ) // ["<img class="latex" style="width:2.323ex; height:2.…l-align: -0.171ex;" src="https://td.com/1.png" />"] // 下面把第一个"?"去掉,发现结果就是全部匹配了。 str . match ( /<img.*/?>/g ) // ["<img class="latex" style="width:2.323ex; height:2.…1ex;" src="https://td.com/1.png" /><span>s</span>"]

先行斷言

x 只有在y 前面才匹配,必須寫成/ x(?=y)/的形式

舉例:

查找字符串%前面的數字

conststr='The best way to achieve a goal is to devote 100% of your time and energy to it.'str.match(/d+(?=%)/g)

先行否定斷言

x 只有不在y 前面才匹配,必須寫成/ x(?!y)/的形

舉例:

查找字符串中數字不在%前面的數字

let str = 'I have more than 100 books' str . match ( /d+(?!%)/g ) // ["100"] str = 'I have more than 100 books, but only 20% is about software' str . match ( /d+(?!%)/g ) // 【注意】2也匹配到了,如果需要把20也过滤掉,需要额外加代码// ["100", "2"]

非獲取匹配

輸出內容,但是不匹配

舉例:

輸出查找到的內容

/(?:js|golang) is good/ . exec ( 'js is good, golang is good' ) // js这个词虽然有()进行处理,但是不会被匹配到,而是整体输出`js is good` // ["js is good", index: 0, input: "js is good, golang is good", groups: undefined] /(js|golang) is good/ . exec ( 'js is good, golang is good' ) // 去掉“?:”之后的结果// ["js is good", "js", index: 0, input: "js is good, golang is good", groups: undefined]

後行斷言

"後行斷言"正好與"先行斷言"相反, x 只有在y 後面才匹配, 必須寫成/(?<=y)x/的形式

舉例:

查找¥後面的數字

letstr=`I spent ¥100 RMB to buy this book`/(?<=¥)d+/.exec(str)

後行否定斷言

x 只有不在y 後面才匹配,必須寫成/(?<! y)x/的形式

舉例:

查找不是¥後面的數字

letstr=`I spent $100 RMB to buy this book`;/(?<!¥)d+/.exec(str)// ["100", index: 9, input: "I spent $100 RMB to buy this book", groups: undefined]

對於文章不足之處,歡迎留言指出,也可以發送郵件給我([email protected]),謝謝。 BTW,字節歡迎更多前端同學的加入。

What do you think?

Written by marketer

blank

給圖上的邊“扎個頭髮”會怎樣?

blank

從敲下一行JS代碼到這行代碼被執行,中間發生了什麼?