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

标签 c# .net regex

我正在尝试创建一个 .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/

相关文章:

c# - 命名空间 'Entity' 中不存在类型或命名空间名称 'System.Data'

mysql - 向 mysql 正则表达式添加一个点

regex - 仅匹配可能重复也可能不重复的数字和点 (.)

c# - System32 文件夹的 Environment.GetFolderPath(Environment.SpecialFolder.System) 和 Environment.SystemDirectory 之间的区别

java - 找不到适合模式的正则表达式

c# - 类型参数统一

C# 通过添加属性扩展类

c# - 如何创建虚拟显示?

.net - 经典ASP调用.NET组件-如何处理线程?

c# - Texture2D.GetData() 返回不同的数据