Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 捕获外部paren/括号组,同时忽略内部paren组_C#_Regex_Regex Group - Fatal编程技术网

C# 捕获外部paren/括号组,同时忽略内部paren组

C# 捕获外部paren/括号组,同时忽略内部paren组,c#,regex,regex-group,C#,Regex,Regex Group,这是我的一个排列。这个答案对我来说非常有效,直到我遇到了一个引起问题的edge案例。我现在需要一个经过调整的正则表达式模式。我曾试图在上个月自己解决这个问题,但我对正则表达式的了解还不够深入 与我上一篇文章(链接在上面)不同的是,我现在只对匹配以([开始的paren分组感兴趣,而不仅仅是()。分组的结尾保持不变:) 为了完整起见,这是前面的全部问题,根据新的要求进行了修改: 我正在使用C#和regex,试图捕获外部paren组,而忽略内部paren组。我有一个遗留生成的文本文件,其中包含数千个字

这是我的一个排列。这个答案对我来说非常有效,直到我遇到了一个引起问题的edge案例。我现在需要一个经过调整的正则表达式模式。我曾试图在上个月自己解决这个问题,但我对正则表达式的了解还不够深入

与我上一篇文章(链接在上面)不同的是,我现在只对匹配以
([
开始的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);
我需要对上面的正则表达式模式稍作调整,以便它只匹配以
([
开头的分组,而不仅仅是以
)开头的分组。结尾保持不变:

需求匹配很简单:

  • 打开括号+方括号(
    ([
    )要么是文件中的第一个字符,要么紧跟在
    换行符之后
  • 关闭参数要么是文件中的最后一个字符,要么后面跟一个
    换行符
  • 我希望正则表达式模式忽略所有不符合上面数字1和2的paren分组。所谓“忽略”,我的意思是它们不应该被视为匹配项,但它们应该作为外部分组匹配的一部分返回

    因此,为了实现我的目标,当我的C#regex与上面的示例运行时,我应该返回一个regex
    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
      字符
    • \r?$
      -可选CR和行尾
    Regex.Matches(text,@“(?=\(\[)^\(?>)((?)\[^()]+\)(?)*\)\r?$”,RegexOptions.Multiline.Cast()。选择(x=>x.Value)。ToList()