繁体   English   中英

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

[英]Regex takes a long time to complete

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

  • 行开始
  • 多 '-'
  • 也许是一个白色空间(可能更多)
  • 至少一个角色
  • 也许更多的人物和白色空间
  • 也许是一个白色空间(可能更多)
  • 多 '-'
  • 行结束

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

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

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

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

我认为其中有很多比赛,而且Regex很难列举所有这些比赛,但我不确定。

环境信息:Windows 7,框架3.5

谢谢

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

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

所以解释:

  • 行开始
  • 至少两个' - '
  • 也许是一个白色空间(可能更多)
  • 不再 '-'
  • 至少一个角色
  • 也许更多的人物,白色空间或' - '
  • 不再 '-'
  • 也许是一个白色空间(可能更多)
  • 至少两个' - '
  • 行结束

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

将嵌套分组展开为

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

否则,您的模式将容易发生灾难性的回溯

请参阅正则表达式演示

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

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

看到这个正则表达式演示

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM