c# - 正则表达式验证花费太长时间 c#
问题描述
我有一个使用正则表达式进行验证的场景。
这是我需要验证的文本格式,如下所示:
有效文本
姓名测试+公司abc def +电话3434 +车辆测试+感兴趣yyy +邀请zzz
无效文本:
name te%st +company +phone 3434 +vehicle test +有兴趣 yyy +invited zzz
规则
- 文本中不应有任何其他字符,如上面的 %。
- 同样,第一个单词必须跟在空格后面,然后应该有一些文本,然后是 + 号。
这是我写的正则表达式:
^(([a-z]*[A-Z]*\s?)+(\w*\s*)*\+)*$
我面临的问题是当文本有效Regex.Match(text)
时立即返回 true。但是当我在文本中添加一些其他无效的字符时,它需要很长时间并且调试器永远不会返回。
解决方案
无效,它需要太长时间并且调试器永远不会返回。
您要求解析器考虑太多场景,并且必须在返回之前消除所有场景;因此缓慢。
建议
which的使用*
意味着零次或多次出现使正则表达式解析器重新考虑(回溯)其他可能的匹配项。
从国际象棋的角度考虑,实际上有数百万种可能的组合。使用*
就像说给我所有可能的动作。但是我们只想要相关的动作……正则表达式模式锻造也是如此;保持在最低限度。
使用,如果您真的知道会有 1 个或多个项目而不是零
*
,则更喜欢使用。+
它将回溯保持在最低限度并加快解析速度。对于您的失败场景,与其尝试匹配世界,为什么不首先检查无效匹配以使匹配失败?这可以通过
^(?! )
模式来完成。所以,你的规则提到了一个失败的非字符找到,所以把它放在第一位^(?!.+%)
。也就是说,如果文本中有%
某个地方,则匹配失败。- 一旦 #2 完成,然后只关注提供最佳情况的有效模式。
您的示例数据是有问题的,但是本着您想要作为起点的精神,我将从以下模式开始:
^(?!.+%)(\w+\s\w+\s\+\w+\s?)+
上面说失败%
,那么应该有1个或多个模式(字空间字空间+
字和可能的空间)
推荐阅读
- python - 我需要帮助嵌套这个矩阵列表(调试)
- python - 如何使用 Pandas 和 PyAutoGui.Write 创建循环
- powershell - PowerShell ISE 不允许我在以管理员身份运行时设置断点
- python - Python:将数据框转换为带有样式的html
- react-native - 代码一次激活所有开关。我一次只需要一个开关
- jquery - Toggle Burger Menu Dropdown - 当屏幕很小时,单击 Burger Menu 无济于事
- r - 无法使用 stringr::string_extract 在正则表达式中转义 $
- arrays - 如何在 Go 中清除和重用数组(不是切片)?
- mongodb - MongoDB - 我可以创建一个索引来隔离文档键中的值以加快搜索速度吗?
- python - 如何正确验证 REST API 查询参数?