gpt4 book ai didi

c# - 使用 RegEx 平衡匹配括号

转载 作者:IT王子 更新时间:2023-10-29 04:10:36 27 4
gpt4 key购买 nike

我正在尝试创建一个 .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)(?!))说“如果有开放捕获,则失败”。

Microsoft's documentation也很有帮助。

关于c# - 使用 RegEx 平衡匹配括号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7898310/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com