【问题标题】:Splitting string on dots but not on dots within round brackets在点上拆分字符串,但不在圆括号内的点上拆分
【发布时间】:2026-01-28 23:45:01
【问题描述】:

我想实现上述目标,但没有做到。

我已经尝试过正则表达式"\.(?![^(]*\))",但目前还不行。

我想像这样拆分字符串"replace(<<accountname>>.right(4), Saturn).invert()"

replace(<<accountname>>.right(4), Saturn)
invert()

【问题讨论】:

    标签: c# regex split


    【解决方案1】:

    如果没有一些示例,要真正测试它有点困难,但这是否符合您的要求?

    (?<!\()\.(?!\))
    

    说明:它使用否定的lookbehind来确保点之前的字符不是左括号,使用否定的lookahead来确保它之后的字符不是右括号。

    【讨论】:

    • 问题中有一个例子,replace(&lt;&lt;accountname&gt;&gt;.right(4), Saturn).invert(),也显示了预期的结果。 It is clear 您的正则表达式匹配两个点,因此将产生 3 个拆分(单击 .NET 正则表达式测试器底部的 Splits 选项卡)。
    【解决方案2】:

    您可以使用 匹配 方法,即匹配平衡括号之间的任何一次或多次出现的字符串或.以外的任何字符:

    var output = Regex.Matches(text, @"(?:\((?>[^()]+|(?<o>)\(|(?<-o>)\))*\)|[^.])+")
        .Cast<Match>()
        .Select(x => x.Value)
        .ToList();
    

    请参阅.NET regex demo详情

    • (?: - “容器”非捕获组的开始:
      • \( - 一个 ( 字符
      • (?&gt;[^()]+|(?&lt;o&gt;)\(|(?&lt;-o&gt;)\))* - 零次或多次出现(回溯到模式被禁用,因为(?&gt;...) 是一个原子组,这样模式是有效的)
        • [^()]+| - 除了() 之外的一个或多个字符,或者
        • (?&lt;o&gt;)\(| - 一个 ( 字符,并将一个值推送到组“o”捕获堆栈,或
        • (?&lt;-o&gt;)\) - 一个 ) 字符,并且从组“o”捕获堆栈中弹出一个值
      • \) - 一个 ) 字符
    • | - 或
      • [^.] - 除. char 以外的任何字符
    • )+ - 小组结束,重复一次或多次。

    【讨论】: