[英]Positive lookbehind vs match reset (\K) regex feature
使用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.