我将创建一个正则表达式来搜索文本,但前提是匹配项后没有破折号。我为此使用前瞻性
Text[\s\.][0-9]*(?!-)
Expected result Result
--------------- -------
Text 11 Text 11 Text 11
Text 52- <No Match> Text 5
测试用例:https://regex101.com/r/doklxc/1/
前瞻性似乎只与前一个字符匹配,这使我留下Text 5
,而我需要它根本不返回匹配项。
我正在检查https://www.regular-expressions.info/指南并尝试使用组,但我无法将其包裹住。
如何做到这一点,以使lookbehind函数影响整个前面的比赛?
我使用默认的.Net Text.RegularExpressions库。
答案 0 :(得分:3)
[0-9]*
回溯并让正则表达式引擎即使有-
也能找到匹配项。
有两种方法:要么使用原子组,要么在前瞻中检查数字:
Text[\s.][0-9]*(?![-\d])
或
Text(?>[\s.][0-9]*)(?!-)
请参见regex demo #1和regex demo #2。
详细信息
Text[\s.][0-9]*(?![-\d])
匹配Text
,然后是点或空格,然后是0或多个数字,然后它检查右边是否有-
或数字,如果那里,比赛失败。即使试图回溯并匹配比以前捕获的位数少的数字,前行中的\d
也会使这些尝试失败Text(?>[\s.][0-9]*)(?!-)
与Text
匹配,然后一个原子组开始,在该模式下,当组模式找到其匹配的文本后,将不让回溯。 (?!-)
仅在-
模式尝试捕获任何数字后才检查[0-9]*
。