正则表达式前瞻只删除最后一个字符

Regex lookahead only removing the last character

我正在创建一个用于搜索文本的正则表达式,但前提是匹配后没有破折号。我为此使用前瞻:

Expected result Result --------------- ------- Text 11 Text 11 Text 11 Text 52- <No Match> Text 5

测试用例:https://regex101.com/r/doklxc/1/

前瞻似乎只与前一个字符匹配,这给我留下 Text 5,而我需要它根本 return 不匹配。

我正在查看 https://www.regular-expressions.info/ 指南并尝试使用群组,但我无法理解这个。

我怎样才能使后视功能影响整个前面的匹配?

我正在使用默认的 .Net Text.RegularExpressions 库。

[0-9]* 回溯并让正则表达式引擎找到匹配项,即使存在 -

有两种方法:使用原子组或在前瞻中检查数字:

Text[\s.][0-9]*(?![-\d])

或者

Text(?>[\s.][0-9]*)(?!-)

参见regex demo #1 and the regex demo #2

详情

  • Text[\s.][0-9]*(?![-\d]) 匹配 Text,然后是一个点或一个空格,然后是 0 个或多个数字,然后它检查是否有一个 - 或紧靠右边的数字,如果有,则匹配失败。即使尝试回溯并匹配比之前抓取的数字更少的数字,前瞻中的 \d 也会使这些尝试失败
  • Text(?>[\s.][0-9]*)(?!-) 匹配 Text,然后一个原子组开始,在组模式找到它们的匹配文本后不会让回溯进入。 (?!-) 仅在 [0-9]* 模式尝试获取任何数字后检查 -