正则表达式是前端开发中必不可少的一种技术,能够快速且准确地匹配文本。在 ES9 中,新增加了条件断言的功能,可以实现更加准确的条件匹配。本文将详细介绍条件断言的概念、语法、用法,并通过示例代码加深理解。
条件断言的概念
在正则表达式中,条件断言可以理解为一个测试条件,用来匹配满足特定条件的字符串。条件断言分为正向先行断言和反向先行断言。正向先行断言用于匹配符合条件的字符串,反向先行断言用于匹配不符合条件的字符串。 条件断言可以是一个单独的表达式,也可以是多个表达式的组合。
条件断言的语法
条件断言的语法如下:
- 正向先行断言:
(?=exp)
或者(?<=exp)
- 反向先行断言:
(?!exp)
或者(?<!exp)
其中,exp
为一个正则表达式,括号中的 ?
符号加上等号(=、<=
)或者感叹号(!
)即为条件断言的符号。
(?=exp)
表示条件为 “exp 后面有相同的字符”(?<=exp)
表示条件为 “exp 前面有相同的字符”(?!exp)
表示条件为 “exp 后面没有相同的字符”(?<!exp)
表示条件为 “exp 前面没有相同的字符”
条件断言的用法
正向先行断言
来看一个例子:
const str = 'Hello, World'; const exp = /Hello(?=,)/; const result = str.match(exp); console.log(result); // ['Hello']
在上面的代码中,正向先行断言 (?=,)
表示 “后面有逗号”。因此,匹配到的结果是 Hello
。
再看一个例子:
const str = '1234'; const exp = /\d{4}(?=\b)/; const result = str.match(exp); console.log(result); // ['1234']
在上面的代码中,正向先行断言 (?=\b)
表示 “后面有单词边界”。因此,匹配到的结果是 1234
。
反向先行断言
来看一个例子:
const str = '1234'; const exp = /(?<!\d)\d{4}/; const result = str.match(exp); console.log(result); // ['1234']
在上面的代码中,反向先行断言 (?<!\d)
表示 “前面没有数字”。因此,匹配到的结果是 1234
。
再看一个例子:
const str = 'Hello World!'; const exp = /(?!World)[a-zA-Z]+/g; const result = str.match(exp); console.log(result); // ['Hello', '!']
在上面的代码中,反向先行断言 (?!World)
表示 “后面没有 World 字符串”。因此,匹配到的结果是 Hello
和 !
。
示例代码
下面是一些示例代码,帮助理解条件断言的使用:
货币单位转换
const str = '10$'; const exp = /^\d+(?=\$)/; const result = str.match(exp); console.log(result); // ['10']
在上面的代码中,正向先行断言 (?=\$)
表示 “后面有美元符号”。因此,匹配到的结果是 10
。
限制长度
const str = 'hello world'; const exp = /^(?=.{8})(?=.*[a-z])(?=.*[A-Z])(?=.*\d).+$/; const result = str.match(exp); console.log(result); // null
在上面的代码中,正向先行断言 (?=.{8})
表示 “长度为 8 个字符”,(?=.*[a-z])
表示 “至少包含一个小写字母”,(?=.*[A-Z])
表示 “至少包含一个大写字母”,(?=.*\d)
表示 “至少包含一个数字”。因此,匹配到的结果是 null
,因为 hello world
的长度为 11 个字符,不满足长度为 8 的条件。如果将 str
的值修改为 Hello1world
,则结果为 Hello1world
。
过滤手机号码
const arr = ['13800138000', '1380013xxt01', '138 0013 8001']; const exp = /^(?=^.{11}$)\d+$/; const result = arr.filter((item) => item.match(exp)) console.log(result); // ['13800138000']
在上面的代码中,正向先行断言 (?=^.{11}$)
表示 “长度为 11 个字符”。因此,通过匹配长度为 11 个字符的字符串,可以过滤掉非法的手机号码。
总结
条件断言是正则表达式中的一种高级用法,可以让开发者更加灵活地处理字符串。本文详细介绍了条件断言的概念、语法、用法,还通过示例代码说明了它的应用。希望本文能对大家有所帮助,掌握条件断言的技巧,能让我们的前端开发更加高效、准确。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64672e31968c7c53b0791de4