在点上拆分字符串,但不在圆括号内的点上拆分

Splitting string on dots but not on dots within round brackets

我很想实现以上但没能做到。

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

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

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

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

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

说明:它使用负向后向确保点之前的字符不是左括号,并使用负向前向确保点之后的字符不是右括号。

您可以使用 匹配 方法,即匹配平衡括号或除 .:[=31 以外的任何字符之间出现的任意一个或多个字符串=]

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

参见.NET regex demo详情:

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