Home

正则中的断言匹配

# 非贪婪匹配

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

查找字符串的数字,如果有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)/的形式

查找字符串%前面的数字

const str = '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"] 

# 后行断言

"后行断言"正好与"先行断言"相反 , x 只有在 y 后面才匹配 , 必须写成/(?<=y)x/的 形式

查找¥后面的数字

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

# 后行否定断言

x 只有不在 y 后面才匹配,必须写成/(?<! y)x/的形式

查找不是¥后面的数字

let str = `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]