正则表达式后行断言 • 探索 ES2018 和 ES2019

时间: 2018-07-12阅读: 1285标签: 正则

RegExp 后行断言

本章将解释由Gorkem Yakin,Nozomu Katō,Daniel Ehrenberg等人给出的RegExp 后行断言(Lookbehind Assertion)提案。

一个 先后行断言(Lookaround Assertion)是正则表达式中的一个构造,明确了当前位置的前后字符序列,但没有其他副作用。亦称为零宽断言(Zero-width Assertion)。

当前 JavaScript 唯一支持的 Lookaround Assertion 是 先行断言(Lookahead Assertion),其匹配当前位置接下来的字符序列,而本章描述的 后行断言 提案匹配的是当前位置前面的字符序列。


先行断言

正则表达式中的先行断言意味着:后续字符序列必须与断言相匹配,但没有其他副作用。即,不捕获任何东西,且匹配到的字符串不包含断言部分。

以如下正则表达式为例:

const RE_AS_BS = /aa(?=bb)/;

它匹配字符串 'aabb',但是匹配到的内容是不包含 'bb' 的:

const match1 = RE_AS_BS.exec('aabb');
console.log(match1[0]); // 'aa'

而且,它还不匹配那种没有两个 'b' 的字符串:

const match2 = RE_AS_BS.exec('aab');
console.log(match2); // null

一个负向先行断言(Negative Lookahead Assertion)意味着后续字符序列必须与该断言不匹配 。例如:

> const RE_AS_NO_BS = /aa(?!bb)/;
> RE_AS_NO_BS.test('aabb')
false
> RE_AS_NO_BS.test('aab')
true
> RE_AS_NO_BS.test('aac')
true


后行断言

后行断言与先行断言的工作方式类似,但是方向相反。


正向后行断言

对于一个正向后行断言(Positive Lookbehind Assertion)来说,当前位置的前继字符序列必须与该断言匹配(没有其他副作用)。

const RE_DOLLAR_PREFIX = /(?<=\$)foo/g;
'$foo %foo foo'.replace(RE_DOLLAR_PREFIX, 'bar');
    // '$bar %foo foo'

正如你所见,仅仅当前面是美元符号的那个 'foo' 被替换了。另外你也看到,因为美元字符后面的字符序列('foo')完全被'bar'替换掉了,所以美元符号不是匹配结果的一部分。

不使用后行断言而想达到同样结果的实现方式就没这么优雅:

const RE_DOLLAR_PREFIX = /(\$)foo/g;
'$foo %foo foo'.replace(RE_DOLLAR_PREFIX, '$1bar');
    // '$bar %foo foo'

如果前继字符也在上一个匹配中时,这种实现方式就不起作用了。

> 'a1ba2ba3b'.match(/(?<=b)a.b/g)
[ 'a2b', 'a3b' ]


负向后行断言

负向后行断言(Negative Lookbehind Assertion)仅仅当前位置的前继字符序列与断言 不匹配 时才匹配,并无其他副作用。例如:

const RE_NO_DOLLAR_PREFIX = /(?<!\$)foo/g;
'$foo %foo foo'.replace(RE_NO_DOLLAR_PREFIX, 'bar');
    // '$foo %bar bar'

如果不使用后行断言的话,要达到同样的结果,是没有其他简单的(一般的)实现方式。


总结

在正则表达式的尾部,使用先行断言最有意义。而在正则表达式的开头,使用后行断言最有意义。

使用先后行断言的用例有:

  • replace()
  • match() (尤其当正则表达式有修饰符 /g)
  • split() (注意 ' b,c' 开始处的空格):

    > 'a, b,c'.split(/,(?= )/)
    [ 'a', ' b,c' ]
    

除了上述用例外,你也随时可以在正则表达式中使用断言。


进一步阅读


原文链接: exploringjs.com  
翻译来源:www.zcfy.cc


站长推荐

1.云服务推荐: 国内主流云服务商,各类云产品的最新活动,优惠券领取。地址:阿里云腾讯云华为云

2.广告联盟: 整理了目前主流的广告联盟平台,如果你有流量,可以作为参考选择适合你的平台点击进入

链接: http://www.fly63.com/article/detial/922

关闭

17 个案例带你 5 分钟搞定 Linux 正则表达式

正则表达式是一种字符模式,用于在查找过程中匹配制定的字符。元字符通常在Linux中分为两类:Shell元字符,由Linux Shell进行解析;正则表达式元字符,由vi/grep/sed/awk等文本处理工具进行解析;

密码强度的正则表达式(JavaScript)总结

本文给出了两个密码强度的正则表达式方案,一个简单,一个更复杂和安全。并分别给出了两个方案的解析和测试程序。一般大家可以根据自己的项目的实际需要,自行定义自己的密码正则约定。

javascript正则表达式:匹配所有html标签

这个正则表达式也是收集于网络,但是我可以看懂,首先,html标签肯定是以<符号开始的,以>符号结束(不管是不是自闭合),只是中间有点纠结,可能有字符,数字,引号,换行符——但是,却万万没有>,因为有它的话html标签就结束了

JavaScript正则表达式常用技巧

正则表达式是用于匹配字符串中字符组合的模式。在 JavaScript 中,正则表达式也是对象。这些模式被用于 RegExp 的 exec 和 test 方法, 以及 String 的 match、matchAll、replace、search 和 split 方法

前端正则表达式书写

/正则表达式/修饰符/i (忽略大小写),/g (全文查找出现的所有匹配字符),/m (多行查找),/gi(全文查找、忽略大小写),/ig(全文查找、忽略大小写),不写修饰符默认只匹配一个

JavaScript 正则表达式

正则表达式(英语:Regular Expression,在代码中常简写为regex、regexp或RE)使用单个字符串来描述、匹配一系列符合某个句法规则的字符串搜索模式。搜索模式可用于文本搜索和文本替换。

正则匹配身份证有bug你知道么?

在开发中,我们需要验证用户的输入信息,多半采用正则验证,下面就是身份证证号的几种常用的正则表达式:但是这些并不能管用,是不是很气人?这是为什么呢?

JS常用正则表达式备忘录

正则表达式或regex用于匹配字符串的各个部分 下面是我创建正则表达式的备忘单。匹配正则使用 .test() 方法,匹配多个模式使用操作符号 |,使用i标志表示忽略大小写

JS常用正则表达&RegExp对象

本来想细致整理一下正则表达式和RegExp对象的,但是发现网上完善的教程一抓一大把,于是这篇文章只会记录一些常常用到的正则表达式以及稍做分析。

javascript正则表达式怎么用?

正则表达式(Regular Expression)是一门简单语言的语法规范,是强大、便捷、高效的文本处理工具,它应用在一些方法中,对字符串中的信息实现查找、替换和提取操作。

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!