当前位置: 首页 > 知识库问答 >
问题:

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

郭乐湛
2023-03-14

这是我前面的SO问题的一个排列。这个答案对我来说非常有效,直到我遇到了一个导致问题的边缘案例。我现在需要一个调整的正则表达式模式。我试着在Regex Storm上自己解决这个问题,但是我对Regex的了解还不够深入。

与我上一篇文章(链接在上面)的一个变化是,我现在只对匹配以([开头的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 )
)

我正在寻找一个regex来捕获上面示例中的3个分组,下面是上一篇SO文章中的解决方案:

Regex regex = new Regex(@"\((?>\((?<c>)|[^()]+|\)(?<-c>))*(?(c)(?!))\)"); 
return regex.Matches(str);

我需要对上面的regex模式稍作调整,以便它只匹配以([)开头的分组,而不仅仅是以()开头的分组。结尾保持不变:)

    null

是怎么做的?

共有1个答案

张勇
2023-03-14

您可以在模式的开始处应用积极的前瞻,该模式需要在初始的(之后使用[。此外,由于前导的([只能出现在行的开始处,而结束的)只能出现在行的结尾处,因此添加^\r?$锚点是有意义的(注意,\r?是必需的,因为多行模式中的$只匹配\n之前的位置,而不是\r之前的位置)。

因此,您的正则表达式可以调整为

var results = Regex.Matches(text, 
                  @"^\((?=\[)(?>\((?<c>)|[^()]+|\)(?<-c>))*\)\r?$", 
                  RegexOptions.Multiline)
              .Cast<Match>()
              .Select(x => x.Value)
              .ToList();

请参阅.NET正则表达式演示。

  • ^-行的开始
  • \(-(字符
  • (?=\[)-[应紧跟当前位置
  • (?>\((? )[^()]+\)(?<-c>))* -0个或更多重复
    • \((? ) -(和一个空值被推送到`group“c”捕获堆栈,或
    • [^()]+-除()以外的0个或多个字符,或
    • \)(?<-c>)-)并且从`Group“C”capture Stack
    • 弹出一个空值

 类似资料:
  • 我正在使用C#和regex,试图捕获外部的paren组,同时忽略内部的paren组。我有遗留生成的文本文件,其中包含数千个字符串构造,如下所示: null

  • 问题内容: 关于使用/的最佳实践,我有一个非常基本的问题。我有一个像这样的简单函数(DAO) 并在Web服务中使用DAO功能: OR最好在DAO函数中使用/,如下所示: 问题答案: 没有完美的规则。 如果需要尽早但尽可能晚地捕获异常,通常代码会更清晰,更简单。 您应该考虑在发生这种情况时谁必须采取行动,这决定了您是在方法(addVehicle)内进行操作还是调用方必须执行该操作。 例如: 在此示例

  • 问题内容: 因此,作为我的应用程序的一部分,我需要它从文本文件中读取数据,并在大括号之间获取元素。 例如: 服务器_1 { / directory1 / directory2 } 服务器_2 { /目录1 /目录2 } 然后类似if ,打印目录。 亲切的问候, 问题答案: 您可以尝试以下操作: 说明 匹配任何字符 量词-匹配零到无限次,次数尽可能少,根据需要扩展(延迟) 从字面上匹配字符(区分大小

  • 我定义的正则表达式对所有测试字符串都很好,除了当捕获组顺序被交换时(2016 Fall或16F或18SU),正则表达式中是否有一种方法可以忽略正则表达式的捕获组顺序

  • 我正在尝试编写一个配置文件语法并让ANTLR4来处理它。我对ANTLR很陌生(这是我第一个使用它的项目)。 在很大程度上,我理解大多数配置文件语法需要做什么(或者至少我认为我需要做什么),但我将要阅读的文件将在大括号内包含任意C代码。以下是一个示例: 类似于: 可能有很多这样的人。我似乎无法让它理解我只想忽略(不跳过)源代码。以下是我迄今为止的语法: 问题是,我在C\U BLOCK lexer规则

  • 使用上面的代码片段,是否可以测试忽略调用IgnoreCall的方法。ignoreMethod(Bean)而不需要将整个语句置于布尔条件下? 以下是单元测试代码片段: 注意事项: 重构。即使是糟糕的OO设计,重构也是代价高昂的 方法签名被锁定,除非另一个模式适用于替换 尝试使用Mockito。当和PowerMockito时。在目标静态方法上执行时,存根在运行时调试上不起作用