繁体   English   中英

正面lookbehind vs匹配重置(\\ K)正则表达式功能

[英]Positive lookbehind vs match reset (\K) regex feature

我刚刚了解了Ruby正则表达式中显然没有文档的 \\K行为(感谢anubhava的 回答 )。 此功能(可能名为Keep ?)也存在于PHP,Perl和Python正则表达式中。 它在其他地方被描述为“ 从匹配中丢弃到目前为止匹配的内容 ”。

"abc".match(/ab\Kc/)     # matches "c"

这种行为是否与下面使用的正向外观标记相同?

"abc".match(/(?<=ab)c/)  # matches "c"

如果没有,两者有什么不同之处?

使用String#scan方法可以更容易地看到\\K(?<=...)之间的区别。

lookbehind是一个零宽度断言,它不消耗字符,并且从当前位置进行测试(向后):

> "abcdefg".scan(/(?<=.)./)
=> ["b", "c", "d", "e", "f", "g"]

“保持”特征\\K (不是锚)定义了模式中的位置,其中到目前为止所有匹配的位置都从匹配结果中移除。 但前匹配所有字符\\K 消耗 ,他们只是不会出现在结果中:

> "abcdefg".scan(/.\K./)
=> ["b", "d", "f"]

行为与没有\\K的行为相同:

> "abcdefg".scan(/../)
=> ["ab", "cd", "ef"]

除了从结果中删除\\K之前的字符。

\\K一个有趣用途是模拟可变长度的lookbehind,这在Ruby中是不允许的(对于PHP和Perl也是如此) ,或者避免创建唯一的捕获组。 例如(?<=a.*)f. 可以使用\\K实现:

> "abcdefg".match(/a.*\Kf./)
=> #<MatchData "fg">

另一种方法是编写/a.*(f.)/ ,但是\\K避免了创建捕获组的需要。

请注意, \\K feature还存在于python regex模块中,即使这个也允许可变长度的lookbehinds。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM