【发布时间】:2026-01-28 23:45:01
【问题描述】:
我想实现上述目标,但没有做到。
我已经尝试过正则表达式"\.(?![^(]*\))",但目前还不行。
我想像这样拆分字符串"replace(<<accountname>>.right(4), Saturn).invert()":
replace(<<accountname>>.right(4), Saturn)
invert()
【问题讨论】:
我想实现上述目标,但没有做到。
我已经尝试过正则表达式"\.(?![^(]*\))",但目前还不行。
我想像这样拆分字符串"replace(<<accountname>>.right(4), Saturn).invert()":
replace(<<accountname>>.right(4), Saturn)
invert()
【问题讨论】:
如果没有一些示例,要真正测试它有点困难,但这是否符合您的要求?
(?<!\()\.(?!\))
说明:它使用否定的lookbehind来确保点之前的字符不是左括号,使用否定的lookahead来确保它之后的字符不是右括号。
【讨论】:
replace(<<accountname>>.right(4), Saturn).invert(),也显示了预期的结果。 It is clear 您的正则表达式匹配两个点,因此将产生 3 个拆分(单击 .NET 正则表达式测试器底部的 Splits 选项卡)。
您可以使用 匹配 方法,即匹配平衡括号之间的任何一次或多次出现的字符串或.以外的任何字符:
var output = Regex.Matches(text, @"(?:\((?>[^()]+|(?<o>)\(|(?<-o>)\))*\)|[^.])+")
.Cast<Match>()
.Select(x => x.Value)
.ToList();
请参阅.NET regex demo。 详情:
(?: - “容器”非捕获组的开始:
\( - 一个 ( 字符(?>[^()]+|(?<o>)\(|(?<-o>)\))* - 零次或多次出现(回溯到模式被禁用,因为(?>...) 是一个原子组,这样模式是有效的)
[^()]+| - 除了( 和) 之外的一个或多个字符,或者(?<o>)\(| - 一个 ( 字符,并将一个值推送到组“o”捕获堆栈,或(?<-o>)\) - 一个 ) 字符,并且从组“o”捕获堆栈中弹出一个值\) - 一个 ) 字符| - 或
[^.] - 除. char 以外的任何字符)+ - 小组结束,重复一次或多次。【讨论】: