【问题标题】:Match paren-groups only when not preceded by tab or space仅当前面没有制表符或空格时才匹配括号组
【发布时间】:2020-07-27 21:37:57
【问题描述】:

我的 c# 正则表达式代码:

Regex regex = new Regex(@"\((.*?)\)");
return regex.Matches(str);

...很好地匹配所有“paren groups”,如下面的数据块:

(dirty FALSE)
(composite [txtModel])
(view [star2])
(creationIndex 0)
(creationProps )
(instanceNameSpecified FALSE)
(containsObject nil)
(sName ApplicationWindow)
(txtDynamic FALSE)
(txtSubComposites )
(txtSubObjects )
(txtSubConnections )

但是下面的数据块让它偏离了轨道:

([vog317] of ZZconstant
(dirty FALSE)
(composite [gpGame])
(view [nil])
(creationIndex 1)
(creationProps composite !/gpGame sName Constraint4)
(instanceNameSpecified TRUE)
(containsObject ZZconstant)
(sName NoGo_Track_back_Co)
(description "")
(parameters "")
(languageType Prefix)
(explanation "Some sample text here!")
(salience 1)
(condition "

        (if     (eq ?hoer9_Cl:sName extens)

                then

            (or (eq ?Starry:sName sb405)
                (eq ?Starry:sName sb43)
                (eq ?Starry:sName sb455)
                (eq ?Starry:sName sb48)
            )

        )

")
)

请注意inner-paren组:

       (if      (eq ?hoer9_Cl:sName extens)

                then

            (or (eq ?Starry:sName sb405)
                (eq ?Starry:sName sb43)
                (eq ?Starry:sName sb455)
                (eq ?Starry:sName sb48)
            )

        )

括号括起来的小数据子块应该仅仅被视为(condition paren-group 的一部分,而不是与正则表达式模式匹配。排除它的方法是让模式看到以下两个异常之一:

  • 任何以制表符或空格开头的( 都应从匹配中排除。
  • 任何(if 后跟任何类型的空格都应从匹配中排除。

那么如何修改我的正则表达式模式\((.*?)\) 使其符合上述两条规则?我在Regex Storm 中尝试了一段时间,但我对正则表达式的初学者太了解了。

【问题讨论】:

标签: c# regex regex-group


【解决方案1】:

您可以使用您尝试过的模式,并为列出的 2 个例外中的逻辑添加外观:

(?<![ \t])\((?!if\s)(.*?)\)

说明

  • (?&lt;![ \t]) Negative lookbehind 第一个点断言左边的不是空格或制表符
  • \(匹配(
  • (?!if\s) 负前瞻 第 2 点 断言直接在右边的不是 if 和空白字符
  • (.*?) Capture group 1 匹配除换行符以外的任何字符,非贪婪
  • \) 匹配 )

Regex demo

如果左括号和右括号之间的匹配可以跨越多行,您还可以使用否定字符类[^:

(?<![ \t])\((?!if\s)([^()]*)\)

Regex demo

【讨论】:

  • 第四只鸟:这很有希望,但缺少 1 场比赛:以 (condition 开头的那一场。正确忽略内部的所有子分组,但需要匹配外部分组。 (condition 从行的第一个字符开始(前面是换行符)这一事实意味着它应该匹配。能做到吗?
  • @HerrimanCoder 当括号是该行的第一个字符时,究竟应该匹配什么?只有从开头的双引号到双引号的这一部分? (condition " 或者更大的匹配直到哪一部分?
  • 第四只鸟:我以不同的方式解决了最后一个小边缘情况。您的正则表达式模式效果很好。非常感谢!!
猜你喜欢
  • 1970-01-01
  • 2014-09-19
  • 2017-08-09
  • 1970-01-01
  • 2021-10-30
  • 1970-01-01
  • 1970-01-01
  • 2019-08-17
  • 2023-03-05
相关资源
最近更新 更多