【发布时间】:2015-05-15 09:07:49
【问题描述】:
我想匹配字符串,其中foo 出现在select([...]) 中,但前提是可能出现的括号匹配在一起。例如。匹配 select(((foo))) 或 select(x(())(foo(x))()x((y)x)x()) 但不匹配 select((foo) 或 select(x(foo)y()。
我知道,我必须限制嵌套括号的最大数量,我想出了以下正则表达式来解决另外一对括号的问题:
select\((?:
(?:[^()]*|[^()]*\([^()]*\)[^()]*)*
foo
(?:[^()]*|[^()]*\([^()]*\)[^()]*)*
|
(?:[^()]*|[^()]*\([^()]*\)[^()]*)*
\([^()]*foo[^()]*\)
(?:[^()]*|[^()]*\([^()]*\)[^()]*)*
)\)
这意味着在 select([...]) 内 either 匹配 foo,前后没有括号或一对括号 或 匹配一对括号内的 foo并且前面或后面没有括号或一对括号。
有人对此有更简洁的解决方案吗?
扩展我的正则表达式以解决另外两对括号的问题如下所示:
select\((?:
(?:[^()]*|[^()]*\((?:[^()]*|[^()]*\([^()]*\)[^()]*)*\)[^()]*)*
foo
(?:[^()]*|[^()]*\((?:[^()]*|[^()]*\([^()]*\)[^()]*)*\)[^()]*)*
|
(?:[^()]*|[^()]*\((?:[^()]*|[^()]*\([^()]*\)[^()]*)*\)[^()]*)*
\((?:
(?:[^()]*|[^()]*\([^()]*\)[^()]*)*
foo
(?:[^()]*|[^()]*\([^()]*\)[^()]*)*
|
(?:[^()]*|[^()]*\([^()]*\)[^()]*)*
\([^()]*foo[^()]*\)
(?:[^()]*|[^()]*\([^()]*\)[^()]*)*
)\)
(?:[^()]*|[^()]*\((?:[^()]*|[^()]*\([^()]*\)[^()]*)*\)[^()]*)*
)\)
其中缩进最多的部分基本上是前面的正则表达式,no or one pair of parentheses 部分已扩展为no or one or two pair of parentheses。
我将最后一个正则表达式放在 regex101 上:https://www.regex101.com/r/fJ6cR4/1
问题是这个正则表达式(甚至更多扩展版本)非常耗时,所以我希望有更好的想法。
【问题讨论】:
-
为什么不使用简单的解析器呢?正则表达式是匹配嵌套语言的错误工具。
-
您使用的是什么正则表达式实现,它支持哪些功能?
-
我想在文件中搜索。通常我使用 Notepad++、Eclipse 或 grepWin。 AFAIK 环顾四周的表达式是允许的,但条件是不允许的。但是可能有允许条件正则表达式的搜索工具,所以如果需要,请随意使用条件(我不太了解)。
-
如果您有兴趣通过:regex101.com/r/nX2jM3/5
标签: regex