在点上拆分字符串,但不在圆括号内的点上拆分
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”捕获堆栈中弹出一个值
\)
- 一个 )
字符
|
- 或者
[^.]
- 除了 .
字符 之外的任何字符
)+
- 小组结束,重复一次或多次。
我很想实现以上但没能做到。
我已经尝试过正则表达式"\.(?![^(]*\))"
,但目前还没有用。
我想像这样拆分字符串 "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”捕获堆栈中弹出一个值
\)
- 一个)
字符
|
- 或者[^.]
- 除了.
字符 之外的任何字符
)+
- 小组结束,重复一次或多次。