在 ECMAScript 2018 (ES9) 中,新增了一种正则表达式的特性—— Lookbehind Assertions(后行断言),可以用于匹配某个位置之前的文本部分,这种特性在某些场景下可以减少代码复杂度,提高代码效率,下面我们来详细了解一下。
Lookbehind Assertions 简介
什么是 Lookbehind Assertions?它是一种用来限定某个位置之前是否符合规则的语法。我们先来看一下一个简单的例子:
(?<=foo)bar
这个正则表达式表示,匹配一个字符串中出现的 "bar",但它必须是紧跟前面的字符序列中出现的 "foo" 的后面。也就是说,它匹配的是前面是 "foo" 的 "bar"。
在上面的例子中,我们用到了 Lookbehind Assertions 的一种形式:(?<=...)
,也就是 "positive lookbehind",意思是 "后行断言必须满足括号内的正则表达式"。还有一种形式:(?<!...)
,也就是 "negative lookbehind",意思是 "后行断言不能满足括号内的正则表达式",这里不做过多解释。
Lookbehind Assertions 用法
下面我们来看一些使用 Lookbehind Assertions 的具体例子。
匹配时间
时钟上的时间通常是以 "hh:mm:ss" 的形式表示。假设我们要从用户输入中识别出分钟数,可以用 Lookbehind Assertions 来进行匹配,这样可以只匹配 ":" 后面的数字(分钟数),而不匹配小时和秒数。
// 匹配时间中的分钟数 const regex = /(?<=:\d{2}:)\d{2}/; const time = '12:34:56'; const minutes = time.match(regex)[0]; console.log(minutes); // 34
这里我们在正则表达式中使用了 Lookbehind Assertions,匹配的是 ":" 后面的两个数字,也就是分钟数。我们使用了 match()
方法来获取匹配的结果。
匹配域名
在众多的网址中,有些是以 "www" 开头,有些是以 "blog" 开头,假设我们只需要匹配 "blog" 域名下的网址,就可以使用 Lookbehind Assertions 进行匹配。
// 匹配 "blog" 域名下的网址 const regex = /(?<=\/\/blog\.)\w+\.\w+/; const url1 = 'https://blog.example.com'; const url2 = 'https://www.example.com'; const blogUrl1 = url1.match(regex)[0]; const blogUrl2 = url2.match(regex); console.log(blogUrl1); // blog.example.com console.log(blogUrl2); // null
这里我们使用了 Lookbehind Assertions 进行匹配,匹配规则是以 "http://" 或 "https://" 开头,后面紧跟着 "blog.",然后是一个二级或三级域名,使用 \w+
来匹配,最后一个 "." 后面也只能是字母。
匹配 emoji
在现代的聊天应用中,Emoji 表情已经成为了越来越流行的表达方式。ES9 的 Lookbehind Assertions 中新增了一个 \p{}. 在 RegEx 中,\p{} 表示 Unicode 属性,这里我们使用 \p{Emoji_Modifier_Base}
可以匹配被标记为 "混合裁切符号基本符号" 的 Emoji。
// 匹配被标记为 "混合裁切符号基本符号" 的 Emoji const regex = /(?<=\s)\p{Emoji_Modifier_Base}\p{Emoji_Modifier}?|[\p{Emoji_Presentation}]/gu; const text = "😊👍🏻👎🏾❤️"; const emojis = text.match(regex); console.log(emojis); // ['😊', '👍🏻', '👎🏾', '❤️']
这里我们使用了 Lookbehind Assertions,在 (?<=\s)
或前面出现了一个空白字符,然后使用了 \p{Emoji_Modifier_Base}\p{Emoji_Modifier}
来匹配 "皮肤颜色修饰符",最后使用了 [\p{Emoji_Presentation}]
来匹配其他 Presentation 格式的 Emoji。
Lookbehind Assertions 总结
在某些场景下,Lookbehind Assertions 可以更容易地进行匹配和捕获,更加简单明了,提高代码可读性和效率。但是,需要注意的是,Lookbehind Assertions 并不是所有浏览器都支持,在使用时需要注意浏览器的版本兼容性。同时,使用时要注意匹配规则的准确性和安全性。
以上就是 Lookbehind Assertions 的介绍和使用方法,这种特性的引入可以让开发者更容易找到所需要的内容,使代码更简洁、明了。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/652a08bb7d4982a6ebc670cb