在 ECMAScript 2018 标准中,新增了一种正则表达式语法,即空断言(Lookahead/Lookbehind Assertions)。空断言是指在正则表达式中,匹配某个位置的前后是否满足某个条件,但是这个条件本身并不会被计入匹配结果中。
空断言语法包含以下4种:
- 正向先行断言(Positive Lookahead Assertions)
- 反向先行断言(Negative Lookahead Assertions)
- 正向后行断言(Positive Lookbehind Assertions)
- 反向后行断言(Negative Lookbehind Assertions)
空断言的出现,让我们可以更精细地进行正则表达式匹配,从而更加方便和自然地完成字符串处理的任务。
正向先行断言
正向先行断言用 (?=...)
表示,它表示匹配的位置后面必须紧跟着满足条件的子表达式。
下面是一个例子:
const regex = /happy(?= birthday)/; const str1 = "happy birthday to you!"; const str2 = "happy new year!"; console.log(regex.test(str1)); // true console.log(regex.test(str2)); // false
正则表达式 happy(?= birthday)
表示:匹配以 happy
开头,后面紧跟着 birthday
字符串的字符序列。在本例中,str1
中满足条件,而 str2
不满足。
反向先行断言
反向先行断言用 (?!...)
表示,它表示匹配的位置后面必须紧跟着一个不满足条件的子表达式。
下面是一个例子:
const regex = /happy(?! day)/; const str1 = "happy birthday!"; const str2 = "happy new year!"; console.log(regex.test(str1)); // true console.log(regex.test(str2)); // false
正则表达式 happy(?! day)
表示:匹配以 happy
开头,后面紧跟着不包含 day
字符串的字符序列。在本例中,str1
中满足条件,而 str2
不满足。
正向后行断言
正向后行断言用 (?<=...)
表示,它表示匹配的位置前面必须紧跟着满足条件的子表达式。
下面是一个例子:
const regex = /(?<=\$)\d+/; const str1 = "$10.99"; const str2 = "10.99"; console.log(str1.match(regex)); // ["10"] console.log(str2.match(regex)); // null
正则表达式 (?<=\$)\d+
表示:匹配在 $
符号后面的一段数字。在本例中,str1
中满足条件,而 str2
不满足。
反向后行断言
反向后行断言用 (?<!...)
表示,它表示匹配的位置前面必须紧跟着一个不满足条件的子表达式。
下面是一个例子:
const regex = /(?<!\$)\d+/; const str1 = "10.99"; const str2 = "$10.99"; console.log(str1.match(regex)); // ["10", "99"] console.log(str2.match(regex)); // ["10", "99"]
正则表达式 (?<!\$)\d+
表示:匹配不在 $
符号后面的一段数字。在本例中,str1
和 str2
均满足条件。
总结
空断言为我们提供了更加精细的匹配能力,可以更方便地进行字符串处理和分析。但是,在使用空断言时,需要注意它并不会计入匹配结果,因此需要根据具体处理要求做出合适的调整。
通过本文的介绍,我们可以了解到正向/反向先行/后行断言的语法和使用方法,并且针对不同的需求做出不同的处理。在实际应用中,可以结合更多的正则表达式技巧和应用场景,为我们的前端开发带来更大的便利和效率。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64ca0ef85ad90b6d041963e2