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,字節歡迎更多前端同學的加入。