正则表达式仅会删除最后一个字符

时间:2018-10-16 12:43:33

标签: .net regex negative-lookahead

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

  • 正则表达式: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库。

1 个答案:

答案 0 :(得分:3)

[0-9]*回溯并让正则表达式引擎即使有-也能找到匹配项。

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

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

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

请参见regex demo #1regex demo #2

详细信息

  • Text[\s.][0-9]*(?![-\d])匹配Text,然后是点或空格,然后是0或多个数字,然后它检查右边是否有-或数字,如果那里,比赛失败。即使试图回溯并匹配比以前捕获的位数少的数字,前行中的\d也会使这些尝试失败
  • Text(?>[\s.][0-9]*)(?!-)Text匹配,然后一个原子组开始,在该模式下,当组模式找到其匹配的文本后,将不让回溯。 (?!-)仅在-模式尝试捕获任何数字后才检查[0-9]*