问题
我在使用以下正则表达式来检查有效的文件路径:
^(?:[a-zA-Z]\:\\|\\\\)([^\\\/\:\*\?\<\>\"\|]+(\\){0,1})+$
使用测试字符串 V:\Sample Names\Libraries\DeveloperLib\DeveloperComDlgs\res
被识别为有效。我甚至可以在字符串开头添加无效字符而没有问题。但是,当我向字符串末尾添加无效字符时,网页由于灾难性回溯而冻结。
是什么导致了这个正则表达式字符串的问题?
分解正则表达式
完整字符串: ^(?:[a-zA-Z]\:\\|\\\\)([^\\\/\:\*\?\<\>\"\|]+(\\){0,1})+$
第一组: (?:[a-zA-Z]\:\\|\\\\)
- 检查以下两者之一
- 大写或小写字母后跟冒号和反斜杠
- 双反斜杠
第二组: ([^\\\/\:\*\?\<\>\"\|]+(\\){0,1})
- 第一部分:
[^\\\/\:\*\?\<\>\"\|]+
- 确保没有非法字符 (\ / : * ? < > " | )
- 第二部分:
(\\){0,1}
- 检查分节之间的反斜杠,如有必要,则重复多次
我认为问题可能是 {0, 1}
导致的,因为它允许回溯,但我不确定。你有什么想法吗?
(a+b?)+
这样的内容,它很容易出现灾难性回溯。请改为a+(ba+)*
。 - Wiktor Stribiżewa = [^\\\/\:\*\?\<\>\"\|]
,而b = (\\){0,1}
? - Sara Fuerst^(?:[a-zA-Z]:|\\)(?:\\[^\\\/:*?<>"|]+)+\\?$
- Casimir et Hippolyte^(?>[a-zA-Z]:|\\)(?:\\[^\\\/:*?<>\"|]+)++\\?$
如果不允许尾随反斜杠,则为:^(?>[a-zA-Z]:|\\)(?:\\[^\\\/:*?<>\"|]+)++$
。 - anubhava