C# 捕获外部paren/括号组,同时忽略内部paren组
这是我的一个排列。这个答案对我来说非常有效,直到我遇到了一个引起问题的edge案例。我现在需要一个经过调整的正则表达式模式。我曾试图在上个月自己解决这个问题,但我对正则表达式的了解还不够深入 与我上一篇文章(链接在上面)不同的是,我现在只对匹配以C# 捕获外部paren/括号组,同时忽略内部paren组,c#,regex,regex-group,C#,Regex,Regex Group,这是我的一个排列。这个答案对我来说非常有效,直到我遇到了一个引起问题的edge案例。我现在需要一个经过调整的正则表达式模式。我曾试图在上个月自己解决这个问题,但我对正则表达式的了解还不够深入 与我上一篇文章(链接在上面)不同的是,我现在只对匹配以([开始的paren分组感兴趣,而不仅仅是()。分组的结尾保持不变:) 为了完整起见,这是前面的全部问题,根据新的要求进行了修改: 我正在使用C#和regex,试图捕获外部paren组,而忽略内部paren组。我有一个遗留生成的文本文件,其中包含数千个字
([
开始的paren分组感兴趣,而不仅仅是(
)。分组的结尾保持不变:)
为了完整起见,这是前面的全部问题,根据新的要求进行了修改:
我正在使用C#和regex,试图捕获外部paren组,而忽略内部paren组。我有一个遗留生成的文本文件,其中包含数千个字符串结构,如下所示:
([txtData] of COMPOSITE
(dirty FALSE)
(composite [txtModel])
(view [star3])
(creationIndex 0)
(creationProps )
(instanceNameSpecified FALSE)
(containsObject nil)
(sName txtData)
(txtDynamic FALSE)
(txtSubComposites )
(txtSubObjects )
(txtSubConnections )
)
([txtUI] of COMPOSITE
(dirty FALSE)
(composite [txtModel])
(view [star2])
(creationIndex 0)
(creationProps )
(instanceNameSpecified FALSE)
(containsObject nil)
(sName ApplicationWindow)
(txtDynamic FALSE)
(txtSubComposites )
(txtSubObjects )
(txtSubConnections )
)
([star38] of COMPOSITE
(dirty FALSE)
(composite [txtUI])
(view [star39])
(creationIndex 26)
(creationProps composite [txtUI] sName Bestellblatt)
(instanceNameSpecified TRUE)
(containsObject COMPOSITE)
(sName Bestellblatt)
(txtDynamic FALSE)
(txtSubComposites )
(txtSubObjects )
(txtSubConnections )
)
我正在寻找一个正则表达式,它将捕获上述示例中的3个分组,下面是前一篇SO文章中的解决方案:
Regex regex = new Regex(@"\((?>\((?<c>)|[^()]+|\)(?<-c>))*(?(c)(?!))\)");
return regex.Matches(str);
Regex Regex=newregex(@“\(?>\((?)|[^()]+|\)(?)*((?(c)(?!)\)”;
返回正则表达式匹配项(str);
我需要对上面的正则表达式模式稍作调整,以便它只匹配以([
开头的分组,而不仅仅是以(
)开头的分组。结尾保持不变:)
需求匹配很简单:
([
)要么是文件中的第一个字符,要么紧跟在换行符之后
换行符
MatchCollection
,正好有3个匹配项,如上所示
它是如何完成的?您可以在模式的开头应用正向前瞻,这将需要在初始
(
)之后使用[
。另外,因为前导([
只能出现在行的开头并关闭)
只能出现在一行的末尾,添加^
和\r?$
锚定是有意义的(注意\r?
是必需的,因为在多行模式下$
只匹配\n
之前的位置,而不是\r
之前的位置)
因此,您的正则表达式可能会调整为
var results = Regex.Matches(text,
@"^\((?=\[)(?>\((?<c>)|[^()]+|\)(?<-c>))*\)\r?$",
RegexOptions.Multiline)
.Cast<Match>()
.Select(x => x.Value)
.ToList();
var results=Regex.Matches(文本,
@“^\(?=\[)(?>\((?)\[^()]+)(?)*\)\r?$”,
RegexOptions.Multiline)
.Cast()
.选择(x=>x.Value)
.ToList();
看
详细信息
-行的开头^
-a\(
字符(
-一个(?=\[)
应该紧跟在当前位置之后[
-0次或更多重复(?>\(?)|[^()]+|\(?)*
-\((?)|
)并将空值推送到`Group“c”捕获堆栈上,或(
-0个或更多字符,而不是[^()]+|
和(
,或)
-\)(?)
并且从`Group“c”捕获堆栈中弹出一个空值)
-a\)
字符)
-可选CR和行尾\r?$
Regex.Matches(text,@“(?=\(\[)^\(?>)((?)\[^()]+\)(?)*\)\r?$”,RegexOptions.Multiline.Cast()。选择(x=>x.Value)。ToList()
?