我正在尝试使用正则表达式检查字符串。 粗略地说,正则表达式可以描述如下:
示例:
正则表达式是:
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