引言
正则表达式是前端开发中常用的工具,可以用来匹配、搜索、替换字符串。ECMAScript 2016 引入了一些新的正则表达式扩展,使得正则表达式的功能更加强大。本文将介绍这些新的扩展以及它们的应用技巧。
具名捕获组
在传统的正则表达式中,我们可以使用括号来分组匹配。ECMAScript 2016 引入了具名捕获组,可以给每个括号分组命名,方便后续的操作。
具名捕获组的语法如下:
(?<name>pattern)
其中 name
为组名,pattern
为匹配模式。
比如,我们可以使用具名捕获组来匹配一个字符串中的姓名和年龄:
const str = 'My name is Tom, I am 28 years old.'; const regex = /My name is (?<name>\w+), I am (?<age>\d+) years old\./; const result = str.match(regex); console.log(result.groups.name); // Tom console.log(result.groups.age); // 28
Unicode 属性转义
在传统的正则表达式中,我们可以使用 \d
来匹配数字,\w
来匹配字母、数字和下划线。但是,这些转义字符只能匹配 ASCII 字符集中的字符。ECMAScript 2016 引入了 Unicode 属性转义,可以匹配 Unicode 字符集中的字符。
Unicode 属性转义的语法如下:
\p{PropertyName}
其中 PropertyName
为 Unicode 属性名称,比如 Letter
、Number
、Punctuation
等。
比如,我们可以使用 Unicode 属性转义来匹配一个字符串中的所有汉字:
const str = '我是中国人。'; const regex = /\p{Han}/gu; const result = str.match(regex); console.log(result); // ["我", "是", "中", "国", "人"]
s 修饰符
在传统的正则表达式中,.
只能匹配除了换行符之外的任意字符。ECMAScript 2018 引入了 s
修饰符,可以让 .
匹配任意字符,包括换行符。
s
修饰符的语法如下:
/pattern/s
比如,我们可以使用 s
修饰符来匹配一个字符串中的所有字符,包括换行符:
const str = 'Hello\nWorld'; const regex = /./gs; const result = str.match(regex); console.log(result); // ["H", "e", "l", "l", "o", "\n", "W", "o", "r", "l", "d"]
断言
断言是一种非捕获匹配的方式,不会将匹配结果存入捕获组中。ECMAScript 2018 引入了断言,可以让我们更加方便地匹配字符串。
正向先行断言
正向先行断言用来匹配某个位置后面的内容,但是不包括这个位置本身。
正向先行断言的语法如下:
(?=pattern)
比如,我们可以使用正向先行断言来匹配一个字符串中所有以 http://
开头的链接:
const str = 'http://www.example.com https://www.example.com'; const regex = /(?=http:\/\/)\S+/g; const result = str.match(regex); console.log(result); // ["http://www.example.com"]
负向先行断言
负向先行断言用来匹配某个位置后面不是指定内容的字符串。
负向先行断言的语法如下:
(?!pattern)
比如,我们可以使用负向先行断言来匹配一个字符串中所有不以 http://
开头的链接:
const str = 'http://www.example.com https://www.example.com'; const regex = /(?<!http:\/\/)\S+/g; const result = str.match(regex); console.log(result); // ["https://www.example.com"]
正向后行断言
正向后行断言用来匹配某个位置前面的内容,但是不包括这个位置本身。
正向后行断言的语法如下:
(?<=pattern)
比如,我们可以使用正向后行断言来匹配一个字符串中所有以 example.com
结尾的链接:
const str = 'http://www.example.com https://www.example.com'; const regex = /(?<=\S+:\/\/\S+\.)example\.com/g; const result = str.match(regex); console.log(result); // ["www.example.com", "www.example.com"]
负向后行断言
负向后行断言用来匹配某个位置前面不是指定内容的字符串。
负向后行断言的语法如下:
(?<!pattern)
比如,我们可以使用负向后行断言来匹配一个字符串中所有不以 example.com
结尾的链接:
const str = 'http://www.example.com https://www.example.com'; const regex = /(\S+:\/\/\S+\.)(?<!example\.com)/g; const result = str.match(regex); console.log(result); // ["http://www.", "https://www."]
结论
本文介绍了 ECMAScript 2016 的正则表达式扩展,包括具名捕获组、Unicode 属性转义、s 修饰符和断言。这些新的扩展使得正则表达式更加强大,可以更加方便地匹配字符串。希望本文对大家学习和使用正则表达式有所帮助。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6757cdeb890bd9faa438be4b