我在使用正则表达式方面还比较新手,目前遇到了一个问题。
我正在尝试构建一个正则表达式来匹配以下格式的字符串:
OptionalStaticText{OptionalStaticText %(Placholder) OptionalStaticText {OptionalSubSection} OptionalStaticText} OptionalStaticText
每个 Section
或 Subsection
由 {...}
表示。每个 Placeholder
由 %(...)
表示。每个 Section
或 Subsection
可以具有 OptionalStaticText
、%(Placholder)
和 OptionalSubSection
的任意排列组合。
为此,我创建了一个正则表达式,如下所示(也可以在这里查看)。
/^(?:(?:(?:[\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]
字符组中的有效字符),它会导致超时。这种无效的字符串通过“灾难性回溯”导致超时,可以在上面的链接中进行测试。
我一定犯了一些新手错误,但不确定是什么。是否有任何更改可以避免这种情况?
谢谢。