仅当前面没有制表符或 space 时才匹配父组

Match paren-groups only when not preceded by tab or space

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

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

...很好地匹配下面数据块中的所有“双亲组”:

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

但是下面的数据块将它从 rails 中抛出:

([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 括号组的一部分,而不是与正则表达式模式匹配。排除它的方法是让模式看到以下 2 个异常之一:

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

您可以使用您尝试过的模式,并为列出的 2 个异常中的逻辑添加环视:

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

说明

  • (?<![ \t]) 负后视 第一点 断言直接在左边的不是 space 或制表符
  • \( 匹配 (
  • (?!if\s) 负前瞻 第二点 断言直接在右边的不是 if 和 whitespace char
  • (.*?) 捕获 组 1 匹配除换行符之外的任何字符非贪婪
  • \) 匹配 )

Regex demo

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

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

Regex demo