捕获未跟随某些数字的数字流
我想捕获一些未跟随某些数字的数字流。 例如
input = abcdef lookbehind 123456..... asjdnasdh lookbehind 789432
我想使用负向前瞻捕获789432而不是123。
我试过(?<=lookbehind )([\d])+(?!456)
但它捕获了123456
和789432
。
使用(?<=lookbehind )([\d])+?(?!456)
仅捕获1
和7
。
分组不是我的选择,因为我的用例不允许我这样做。
有什么方法可以使用纯正则表达式捕获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
。