在前端开发中,常常需要用到正则表达式来进行字符串的匹配、替换等操作。ES10 中的正则表达式(RegExp)函数提供了一些新的使用技巧,并且在使用中也需要注意一些错误。
一、 ES10 RegExp 函数的新特性
1. RegExp.prototype.exec 的 groups 属性
在 ES9 中,正则表达式中的命名捕获组(Named capture groups)可以使用 (?<name>...)
语法来定义,匹配到的结果可以通过 result.groups
属性来获取。但是在 ES9 中,groups 属性只能在 String.prototype.match
和 s.replace
函数中使用。
在 ES10 中,RegExp.prototype.exec
也支持使用 groups 属性了。例如:
const re = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/; const result = re.exec('2020-10-18'); console.log(result.groups.year);
2. s 模式
在 ES10 中,正则表达式可以使用 s
修饰符,表示单行模式(dotAll 模式)。在单行模式下,.
可以匹配换行符。例如:
const re = /./s; console.log(re.test('a\nb'));
3. 后行断言
在 ES10 中,正则表达式中可以使用后行断言(Lookbehind assertion),表示匹配某个字符后面的字符串。后行断言需要使用 (?<=...)
语法来定义。例如:
const re = /(?<=\d{3})\d{4}/; console.log(re.exec('1234567890'));
二、 ES10 RegExp 函数的错误解决
在使用 ES10 中的 RegExp 函数时,也需要注意一些常见的错误。
1. 贪婪模式
正则表达式中默认是贪婪模式(greedy mode),即默认情况下尽可能多地匹配字符。例如:
const re = /".+"/; console.log(re.exec('"Hello", "world"'));
上面的正则表达式会匹配到整个字符串,而不是两个引号之间的部分。
如果需要使用非贪婪模式(lazy mode),可以在量词后面加上一个 ?
,表示尽可能少地匹配字符。例如,修改上面的正则表达式:
const re = /".+?"/; console.log(re.exec('"Hello", "world"'));
2. 字符集
在正则表达式中,需要注意字符集(character set)的使用。字符集表示匹配一系列字符中的任意一个。例如:
const re = /[abc]/; console.log(re.test('d'));
上面的正则表达式可以匹配字符 a、b、c 中的任意一个,但是不能匹配字符 d。
如果需要匹配字符集本身,需要使用转义字符 \
。例如:
const re = /\[abc]/; console.log(re.test('[abc]'));
3. 特殊字符
在正则表达式中,一些字符是具有特殊含义的,需要使用转义字符 \
来匹配它们本身。例如:
const re = /\*/; console.log(re.test('a*b'));
上面的正则表达式可以匹配字符 *,而不是通配符。
三、 总结
ES10 中的 RegExp 函数提供了一些新的使用技巧,但是在使用中也需要注意一些常见错误。需要注意的问题包括贪婪模式、字符集、特殊字符等。同时还需要注意,一些新特性不一定所有浏览器都支持,需要进行兼容性处理。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/647c6689968c7c53b0775390