捕获未跟随某些数字的数字流

我想捕获一些未跟随某些数字的数字流。 例如

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

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

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

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

分组不是我的选择,因为我的用例不允许我这样做。

有什么方法可以使用纯正则表达式捕获789432而不是123吗? 对答案的解释表示赞赏。

您可以使用具有负后观的占有量词

 (?<=lookbehind )\d++(? 

看到这个正则表达式演示 。

具有primefaces组的同义模式:

 (?<=lookbehind )(?>\d+)(? 

细节

  • (?<=lookbehind ) - 一个正面的lookbehind,匹配字符串中紧接着是lookbehind
  • \d++ - 占位符匹配的1+位数,不允许回溯到模式中(引擎无法从与\d++匹配的任何数字重试匹配)
  • (? - 如果与\d++匹配的最后3位数为456则会导致匹配失败的负向后视检查。

为什么要向后看,为什么不向前看

负后观(?确保某个模式不会立即与当前位置的左侧匹配。 如果其模式立即匹配到当前位置的右侧,则负向前瞻(?!...)将使匹配失败。 这里的“失败”意味着正则表达式引擎放弃了当前匹配字符串的方式,如果在lookbehind / lookahead之前存在量化模式,则引擎可能会回溯到这些模式以尝试不同地匹配字符串。 注意,在这里,占有量词使得引擎不可能多次执行456的后视检查,只有在用\d++抓取所有数字后才执行它。

(?<=lookbehind )([\d])+(?!456)正则表达式与123456匹配,因为\d+以贪婪的方式匹配这些数字(一次全部)和(?!456)在它们之后检查456 ,由于那里没有456 ,因此返回匹配。 (?<=lookbehind )([\d])+?(?!456)只匹配一位数,因为\d+? 以懒惰方式匹配,匹配1位数,然后执行loolahead检查。 由于在1之后没有456 ,因此返回1

为什么++占有量词

如果之前存在量化模式,则不允许正则表达式引擎以不同方式重试匹配字符串。 所以, (?<=lookbehind )\d+(?123456中的12345匹配,因为在6之前没有456

你也可以使用负面的lookbehind:

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

RegEx演示

RegEx详细信息:

  • (?<=lookbehind ) :积极向后看以断言我们在当前位置之前有"lookbehind "
  • \d+\b :匹配1+位后跟单词边界
  • (? :负面观察断言我们在当前位置之前没有456

使用否定前瞻的替代解决方案

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

RegEx演示2

我们在前瞻表达式中需要\d* (?!\d*456)这样我们可以在匹配当前位置的0位或更多位后跳过456