我正在尝试创建一个 .NET RegEx 表达式来适本地平衡我的括号。我有以下 RegEx 表达式:
func([a-zA-Z_][a-zA-Z0-9_]*)\(.*\)
我要匹配的字符串是这样的:
"test -> funcPow((3),2) * (9+1)"
应该发生的是 Regex 应该匹配从 funcPow
到第二个右括号的所有内容。它应该在第二个右括号之后停止。相反,它一直匹配到最后一个右括号。 RegEx 返回这个:
"funcPow((3),2) * (9+1)"
它应该返回这个:
"funcPow((3),2)"
如有任何帮助,我们将不胜感激。
最佳答案
正则表达式绝对可以做平衡括号匹配。这可能很棘手,需要一些更高级的 Regex 功能,但并不难。
例子:
var r = new Regex(@"
func([a-zA-Z_][a-zA-Z0-9_]*) # The func name
\( # First '('
(?:
[^()] # Match all non-braces
|
(?<open> \( ) # Match '(', and capture into 'open'
|
(?<-open> \) ) # Match ')', and delete the 'open' capture
)+
(?(open)(?!)) # Fails if 'open' stack isn't empty!
\) # Last ')'
", RegexOptions.IgnorePatternWhitespace);
平衡匹配组有几个特性,但对于这个例子,我们只使用捕获删除特性。线路(?<-open> \) )
将匹配 )
并删除之前的“打开”捕获。
最棘手的一行是 (?(open)(?!))
,所以让我解释一下。 (?(open)
是一个条件表达式,只有在存在“打开”捕获时才匹配。 (?!)
是一个总是失败的否定表达式。因此,(?(open)(?!))
说“如果有开放捕获,则失败”。
关于c# - 使用 RegEx 平衡匹配括号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7898310/