首页 > 解决方案 > 正则表达式验证花费太长时间 c#

问题描述

我有一个使用正则表达式进行验证的场景。

这是我需要验证的文本格式,如下所示:

有效文本

姓名测试+公司abc def +电话3434 +车辆测试+感兴趣yyy +邀请zzz

无效文本:

name te%st +company +phone 3434 +vehicle test +有兴趣 yyy +invited zzz

规则

  1. 文本中不应有任何其他字符,如上面的 %。
  2. 同样,第一个单词必须跟在空格后面,然后应该有一些文本,然后是 + 号。

这是我写的正则表达式:

^(([a-z]*[A-Z]*\s?)+(\w*\s*)*\+)*$

我面临的问题是当文本有效Regex.Match(text)时立即返回 true。但是当我在文本中添加一些其他无效的字符时,它需要很长时间并且调试器永远不会返回。

标签: c#regexvalidation

解决方案


无效,它需要太长时间并且调试器永远不会返回。

您要求解析器考虑太多场景,并且必须在返回之前消除所有场景;因此缓慢。


建议

which的使用*意味着零次或多次出现使正则表达式解析器重新考虑(回溯)其他可能的匹配项。

从国际象棋的角度考虑,实际上有数百万种可能的组合。使用*就像说给我所有可能的动作。但是我们只想要相关的动作……正则表达式模式锻造也是如此;保持在最低限度。

  1. 使用,如果您真的知道会有 1 个或多个项目而不是零*,则更喜欢使用。+它将回溯保持在最低限度并加快解析速度。

  2. 对于您的失败场景,与其尝试匹配世界,为什么不首先检查无效匹配以使匹配失败?这可以通过^(?! )模式来完成。所以,你的规则提到了一个失败的非字符找到,所以把它放在第一位^(?!.+%)。也就是说,如果文本中有% 某个地方,则匹配失败。

  3. 一旦 #2 完成,然后只关注提供最佳情况的有效模式。

您的示例数据是有问题的,但是本着您想要作为起点的精神,我将从以下模式开始:

^(?!.+%)(\w+\s\w+\s\+\w+\s?)+

上面说失败%,那么应该有1个或多个模式(字空间字空间+字和可能的空间)


推荐阅读