ES9(也称为 ECMAScript 2018)是 JavaScript 中的一个新版本,它引入了一些新的正则表达式特性。这些特性可以帮助我们更轻松地处理字符串和文本,同时也可以提高代码的效率和可读性。
s 标志符
s 标志符用于匹配所有字符,包括换行符。在 ES9 之前,只有 "." 可以匹配除换行符以外的所有字符。现在,使用 s 标志符就可以轻松地匹配所有字符。
例如,我们想要匹配一个包含换行符的字符串,可以这样写:
const text = "Hello\nworld"; const regex = /Hello.world/s; console.log(regex.test(text)); // true
如果我们没有使用 s 标志符,那么该正则表达式将无法匹配换行符,因此返回值将为 false。
向前断言和向后断言
在 ES9 中,我们可以使用向前断言和向后断言来实现更高级的正则表达式匹配。
向前断言(可匹配在当前位置之前的文本)使用 ?<= 符号,在它之后写上要匹配的文本。
向后断言(可匹配在当前位置之后的文本)使用 ?= 符号,在它之前写上要匹配的文本。
例如,我们想要匹配字符串中所有带有美元符号的数字,但是不想包括美元符号在内。可以使用向前断言 (?<=$) 和向后断言 (?=\D|$) 来实现:
const text = "I have $1000 and he has $50"; const regex = /(?<=\$)\d+(?=\D|$)/g; console.log(text.match(regex)); // ["1000", "50"]
其中,\d+ 匹配一个或多个数字,\D 匹配非数字字符,$ 匹配字符串末尾。$1000 和 $50 前面的美元符号被向前断言匹配掉,后面的非数字字符或字符串末尾被向后断言匹配掉。
可选捕获组
在 ES9 中,我们可以使用 (?<name>...) 语法来给捕获组命名,并且可以将捕获组设置为可选的。
例如,我们想要匹配一个格式为 "year-month-day" 的日期字符串,但是其中的月份和日份是可选的。可以这样写:
const text1 = "2021-06-28"; const text2 = "2021-06"; const text3 = "2021"; const regex = /(?<year>\d{4})(?:-(?<month>\d{2}))?(?:-(?<day>\d{2}))?/; console.log(text1.match(regex).groups); // { year: "2021", month: "06", day: "28" } console.log(text2.match(regex).groups); // { year: "2021", month: "06", day: undefined } console.log(text3.match(regex).groups); // { year: "2021", month: undefined, day: undefined }
其中,(:?-...) 和 ?: 的作用是让捕获组变为可选的。如果没有匹配到捕获组,它对应的值为 undefined。
总结
ES9 引入了一些新的正则表达式特性,包括 s 标志符、向前/后断言和可选捕获组。这些特性可以使我们更轻松地处理字符串和文本,提高代码的效率和可读性。在正则表达式的使用中,需要根据实际情况选择合适的特性来达到更好的编程效果。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64747992968c7c53b01d84ce