正则表达需要很长时间才能完成

时间:2016-04-26 11:58:06

标签: c# .net regex

我想匹配一个结构如下的行:

  • 行首
  • 多个' - '
  • 也许是一个白色空间(可能更多)
  • 至少一个字符
  • 可能更多字符和空格
  • 也许是一个白色空间(可能更多)
  • 多个' - '
  • 行尾

所以我写了这样的正则表达式:

new Regex(@"^\-{2,}\s*(\w+(\w+|\s)*)\s*\-{2,}$");

当我尝试匹配以下行时,这需要很长时间才能完成(没有等待它完成):

-------- Variable used for recipe visualization only - Not loaded into PLC --------

我认为其中有很多比赛并且正则表达式很难列举所有这些比赛,但我不确定。

环境信息:Windows 7,框架3.5

谢谢

编辑:感谢您的帮助,我提出了一个有效的正则表达式:

^-{2,}\s*(?!\-)(\w(?:\w|\s|\-)+)(?<!\-)\s*-{2,}$

所以解释:

  • 行首
  • 至少两个&#39; <&#39;
  • 也许是一个白色空间(可能更多)
  • 没有更多&#39; - &#39;
  • 至少一个字符
  • 可能包含更多字符,空格或&#39; - &#39;
  • 没有更多&#39; - &#39;
  • 也许是一个白色空间(可能更多)
  • 至少两个&#39; <&#39;
  • 行尾

如果你看到有问题请告诉我

1 个答案:

答案 0 :(得分:4)

将嵌套分组展开为

^-{2,}\s*(\w+(?:\s+\w+)*)\s*-{2,}$
             ^^^^^^^^^^^ 

否则,您的模式将倾向于catastrophic backtracking

请参阅regex demo

或者,使用原子组禁用任何回溯到交替组:

^-{2,}\s*((?>\w+(?:\w+|\s)*))\s*-{2,}$
          ^^^              ^ 

请参阅this regex demo

通常,避免在较长的模式中使用嵌套量词(如(\w+|\s)*)中的替换。