这是我前面的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模式稍作调整,以便它只匹配以([
)开头的分组,而不仅仅是以(
)开头的分组。结尾保持不变:)
是怎么做的?
您可以在模式的开始处应用积极的前瞻,该模式需要在初始的(
之后使用[
。此外,由于前导的([
只能出现在行的开始处,而结束的)
只能出现在行的结尾处,因此添加^
和\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时。在目标静态方法上执行时,存根在运行时调试上不起作用