[英]Capture stream of digits which is not followed by certain digits
我想捕获不带某些数字的数字流。 例如
input = abcdef lookbehind 123456..... asjdnasdh lookbehind 789432
我只想使用负前瞻捕获789432,而不是123。
我尝试了(?<=lookbehind )([\\d])+(?!456)
但它捕获了123456
和789432
。
使用(?<=lookbehind )([\\d])+?(?!456)
仅捕获1
和7
。
对我来说,分组不是一个选择,因为我的用例不允许我这样做。
有什么方法可以使用纯正则表达式捕获789432
而不是123
? 答案的解释表示赞赏。
您可以使用带有负数的所有格量词
(?<=lookbehind )\d++(?<!456)
^^ ^^^^^^
请参阅此正则表达式演示 。
具有原子组的同义词模式:
(?<=lookbehind )(?>\d+)(?<!456)
细节
(?<=lookbehind )
-与字符串中紧随其后的位置相匹配的正向后lookbehind
\\d++
-1+个数字所有格匹配,不允许回溯到模式中(引擎无法从与\\d++
匹配的任何数字中重试匹配) (?<!456)
-如果与\\d++
匹配的最后3位数字是456
则负向后检查将使匹配失败。 为什么往后看,为什么不往前看
后面的负向(?<!...)
确保某个模式与当前位置的左侧不立即匹配。 如果负向超前(?!...)
的模式与当前位置的右侧立即匹配,则匹配失败。 这里的“失败”表示正则表达式引擎放弃了当前匹配字符串的方式,如果在后向/向前查找之前存在量化模式,则引擎可能会回溯到这些模式中以尝试以不同方式匹配字符串。 请注意,这里的所有格修饰符使引擎不可能多次执行456
次后向检查,只有用\\d++
抓住所有数字后才执行。
您(?<=lookbehind )([\\d])+(?!456)
正则表达式匹配123456
因为\\d+
以贪婪的方式匹配这些数字(一次全部匹配),而(?!456)
在它们后面检查456
,并且由于那里没有456
,因此返回匹配项。 (?<=lookbehind )([\\d])+?(?!456)
仅匹配一位,因为\\d+?
以惰性方式匹配,匹配1位数字,然后执行loolahead检查。 由于1
之后没有456
,因此返回1
。
为什么
++
所有格量词
如果以前存在量化模式,则它不允许正则表达式引擎以其他方式重试匹配字符串。 因此, (?<=lookbehind )\\d+(?<!456)
匹配123456
中的12345
,因为6
之前没有456
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.