ES11 正则表达式总结以及解决遇到的问题
正则表达式是前端开发中的重要工具之一,它可以帮助我们在字符串中查找、替换、匹配特定的内容。ES11 对正则表达式进行了一些改进和增强,本文将对 ES11 正则表达式进行总结,并解决一些常见的问题。
- 新增了
(?<=...)
和(?<!...)
断言
在 ES11 中,新增了(?<=...)
和(?<!...)
两个断言,用于正则表达式中的先行断言和后行断言。先行断言和后行断言可以帮助我们在匹配字符串时,只匹配满足特定条件的字符串,而不是匹配整个字符串。
先行断言和后行断言的语法如下:
(?<=...)
:表示先行断言,它要求当前位置的前面匹配指定的表达式。(?<!...)
:表示后行断言,它要求当前位置的后面不匹配指定的表达式。
示例代码:
const str = 'hello, world!'; // 匹配以 hello 开头的字符串 console.log(str.match(/(?<=^hello).*/)); // ["hello, world!"] // 匹配不以 hello 开头的字符串 console.log(str.match(/(?<!^hello).*/)); // [" world!"]
- 新增了
String.prototype.matchAll()
方法
ES11 新增了String.prototype.matchAll()
方法,用于在字符串中查找所有匹配指定正则表达式的子串,并返回一个迭代器。该方法返回的迭代器可以让我们逐个遍历所有匹配的子串。
示例代码:
-- -------------------- ---- ------- ----- --- - ------- -------- -- ------------ ----- ----- - ---------------- ----- -------- - -------------------- --- ------ ----- -- --------- - ---------------------- - -- ------- -- -------
- 新增了
RegExp.prototype.dotAll
属性
ES11 新增了RegExp.prototype.dotAll
属性,用于控制.
匹配任意字符时是否包括换行符。如果设置为true
,则.
可以匹配任意字符,包括换行符;如果设置为false
(默认值),则.
不能匹配换行符。
示例代码:
const str = 'hello\nworld'; // 匹配不包括换行符的任意字符 console.log(str.match(/./g)); // ["h", "e", "l", "l", "o", "w", "o", "r", "l", "d"] // 匹配包括换行符的任意字符 console.log(str.match(/./gs)); // ["h", "e", "l", "l", "o", "\n", "w", "o", "r", "l", "d"]
- 解决正则表达式中的贪婪匹配问题
在正则表达式中,*
和+
等量词默认是贪婪的,它们会匹配尽可能多的字符。ES11 中,可以通过在量词后面加上?
来解决贪婪匹配问题,使得量词变成非贪婪的。
示例代码:
const str = '<p>hello</p><p>world</p>'; // 贪婪匹配,匹配尽可能多的字符 console.log(str.match(/<p>.*<\/p>/g)); // ["<p>hello</p><p>world</p>"] // 非贪婪匹配,匹配尽可能少的字符 console.log(str.match(/<p>.*?<\/p>/g)); // ["<p>hello</p>", "<p>world</p>"]
总结
ES11 对正则表达式进行了一些增强和改进,包括新增了(?<=...)
和(?<!...)
断言、String.prototype.matchAll()
方法、RegExp.prototype.dotAll
属性,以及解决了贪婪匹配问题。这些新特性可以让我们更加方便地使用正则表达式,提高开发效率。在开发中,我们可以灵活使用这些特性,解决实际问题。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/65e5883f1886fbafa411c581