仅当前面没有制表符或 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 个异常之一:
- 任何以制表符或 space 开头的
(
都应从匹配中排除。
- 任何
(if
后跟任何一种白色 space 都应从匹配中排除。
那么如何修改我的正则表达式模式 \((.*?)\)
以使其符合上述 2 条规则?我在 Regex Storm 中尝试了一段时间,但我是正则表达式的初学者,无法解决它。
您可以使用您尝试过的模式,并为列出的 2 个异常中的逻辑添加环视:
(?<![ \t])\((?!if\s)(.*?)\)
说明
(?<![ \t])
负后视 第一点 断言直接在左边的不是 space 或制表符
\(
匹配 (
(?!if\s)
负前瞻 第二点 断言直接在右边的不是 if
和 whitespace char
(.*?)
捕获 组 1 匹配除换行符之外的任何字符非贪婪
\)
匹配 )
如果左括号和右括号之间的匹配可以跨越多行,您也可以使用否定字符 class [^
:
(?<![ \t])\((?!if\s)([^()]*)\)
我的 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 个异常之一:
- 任何以制表符或 space 开头的
(
都应从匹配中排除。 - 任何
(if
后跟任何一种白色 space 都应从匹配中排除。
那么如何修改我的正则表达式模式 \((.*?)\)
以使其符合上述 2 条规则?我在 Regex Storm 中尝试了一段时间,但我是正则表达式的初学者,无法解决它。
您可以使用您尝试过的模式,并为列出的 2 个异常中的逻辑添加环视:
(?<![ \t])\((?!if\s)(.*?)\)
说明
(?<![ \t])
负后视 第一点 断言直接在左边的不是 space 或制表符\(
匹配(
(?!if\s)
负前瞻 第二点 断言直接在右边的不是if
和 whitespace char(.*?)
捕获 组 1 匹配除换行符之外的任何字符非贪婪\)
匹配)
如果左括号和右括号之间的匹配可以跨越多行,您也可以使用否定字符 class [^
:
(?<![ \t])\((?!if\s)([^()]*)\)