在某些条件下,C#regex需要很长时间

时间:2017-11-14 11:27:49

标签: c# regex

我正在尝试使用正则表达式检查字符串。 粗略地说,正则表达式可以描述如下:

  • 字符串可以以一个' /'
  • 开头
  • 该字符串后面必须跟一个字母或数字
  • 然后是人物。 - 可以使用_但必须至少跟一个字母或数字
  • 此规则块可以多次使用

示例:

  • /abcd/ga-b1.2.3.4/eeee.abc
  • 012345678901234.aaa

正则表达式是:

var regex = new Regex(@"^(/{0,1}[a-zA-Z0-9]{1,}(([\.\-_]{1,})[a-zA-Z0-9]{1,}){0,}){0,}$")

这个正则表达式工作正常,但有一个问题。当我在字符串的末尾添加_时,我想检查检查过程突然变得非常长: 例如。 " 012345678901234.aaa _"需要大约15秒(使用单元测试来测试)。 " 012345678901234.aaa"只需要大约150毫秒。

我已经发现最后{0,}(允许多次使用所描述规则的块)会影响这一点。删除它会使其与省略_一样快,但在找到第一个匹配后让正则表达式引擎停止。这不是我想要的。

最后{0,}基本上是全局搜索。我使用regex.IsMatch()来确定输入路径是否正确。使用regex.Matches()只是一种解决方法,因为我不知道我应该期待多少个收集条目。我可以搞清楚,但我更喜欢优雅的正则表达式解决方案。

有人可以告诉我,我的正则表达式有什么问题需要这么长时间吗?

RegExr字符串" 012345678901234.aaa _"按预期工作 - 没有性能损失:

/^(\/{0,1}[a-zA-Z0-9]{1,}(([\.\-_]{1,})[a-zA-Z0-9]{1,}){0,}){0,}/g

0 个答案:

没有答案