【发布时间】:2016-04-26 11:58:05
【问题描述】:
我想匹配一个结构如下的行:
- 行首
- 多个'-'
- 可能是空白(可能更多)
- 至少一个字符
- 可能有更多字符和空格
- 可能是空白(可能更多)
- 多个'-'
- 行尾
所以我这样写了正则表达式:
new Regex(@"^\-{2,}\s*(\w+(\w+|\s)*)\s*\-{2,}$");
当我尝试匹配以下行时,这需要很长时间才能完成(没有等待它完成):
-------- Variable used for recipe visualization only - Not loaded into PLC --------
我认为其中有大量匹配项,Regex 很难枚举所有这些匹配项,但我不确定。
环境信息:Windows 7,framework 3.5
谢谢
编辑:感谢您的帮助,我想出了一个有效的正则表达式:
^-{2,}\s*(?!\-)(\w(?:\w|\s|\-)+)(?<!\-)\s*-{2,}$
所以解释:
- 行首
- 至少两个'-'
- 可能是空白(可能更多)
- 没有更多的'-'
- 至少一个字符
- 可能有更多字符、空格或“-”
- 没有更多的'-'
- 可能是空白(可能更多)
- 至少两个'-'
- 行尾
如果你发现有问题请告诉我
【问题讨论】:
-
这不匹配,因为“仅 - 不”中的内部破折号。
-
您的问题是您不允许捕获中间的` - `
-
我刚刚在myregextester.com/index.php 上试过这个,它在 0.018301 秒内运行。但是在 C# 中运行确实需要很长时间,但删除内部破折号确实会加快速度。
-
@juharr 和 Jonesopolis 感谢您的回答。但是为什么它不能只返回false而不是运行很长时间呢?
-
我希望这部分负责:
(\w+(\w+|\s)*)。基本上,只要空格序列保持不变,您就可以对单词和空格序列进行任何分区。由于整个表达式不匹配,回溯将依次访问所有允许的分区。尝试将其替换为(\w+(\s+\w+)*)。