繁体   English   中英

捕获没有特定数字跟随的数字流

[英]Capture stream of digits which is not followed by certain digits

我想捕获不带某些数字的数字流。 例如

input = abcdef lookbehind 123456..... asjdnasdh lookbehind 789432

我只想使用负前瞻捕获789432,而不是123。

我尝试了(?<=lookbehind )([\\d])+(?!456)但它捕获了123456789432

使用(?<=lookbehind )([\\d])+?(?!456)仅捕获17

对我来说,分组不是一个选择,因为我的用例不允许我这样做。

有什么方法可以使用纯正则表达式捕获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

您也可以在后面使用否定式:

(?<=lookbehind )\d+\b(?<!456)

正则演示

正则表达式详细信息:

  • (?<=lookbehind ) :肯定的向后看,断言我们在当前位置之前"lookbehind "
  • \\d+\\b :匹配1+个数字,后跟单词边界
  • (?<!456) :负向后断言断言我们在当前位置之前没有456

使用负前瞻的替代解决方案

(?<=lookbehind )(?!\d*456)\d+

RegEx演示2

在前瞻表达式(?!\\d*456)需要\\d* ,以便在从当前位置匹配0个或多个数字后可以跳过456

暂无
暂无

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

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