【发布时间】:2016-03-24 09:00:05
【问题描述】:
我是使用正则表达式的新手,目前面临一个问题。
我正在尝试构建一个与以下格式的字符串匹配的正则表达式:
OptionalStaticText{OptionalStaticText %(Placholder) OptionalStaticText {OptionalSubSection} OptionalStaticText} OptionalStaticText
每个Section 或Subsection 都用{...} 表示。每个Placeholder 用%(...) 表示。每个Section 或Subsection 可以具有OptionalStaticText、%(Placholder) 和OptionalSubSection 的任意排列。
为此,我创建了一个正则表达式,如下所示(也可以看到here)。
/^(?:(?:(?:[\s\w])*(?:({(?:(?:[\s\w])*[%\(\w\)]+(?:[\s\w])*)+(?:{(?:(?:[\s\w])*[%\(\w\)]+(?:[\s\w])*)+})*})+)(?:[\s\w])*)+)$/g
此表达式完美匹配有效字符串(例如:abc {st1 %(ph1) st11} int {st2 %(ph2) st22}{st3 %(ph3) st33 {st31 %(ph4) st332}} cd,可以在给定的链接中进行测试。
但是,只要输入字符串无效(例如:abc {st1 %(ph1) st11} int {st2 %(ph2) st22}{st3 %(ph3) st33 {st31 %(ph4) st332}} c-d、- 不是[\s\w] 字符组中的有效字符),就会导致超时。
这种无效的字符串会通过Catastrophic backtracking导致超时,也可以在上面的链接中测试。
我一定犯了一些新手错误,但不确定是什么。为了避免这种情况,我应该做出改变吗?
谢谢。
【问题讨论】:
-
我认为单独的正则表达式并不是完成这项工作的正确工具。即使你能做到,生成的正则表达式对大多数人来说都是完全不可读的,因此你将遇到严重的维护问题。您可以尝试编写解析器。
-
开始删除无用组。
标签: javascript regex