【发布时间】: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 中尝试了一段时间,但我对正则表达式的初学者太了解了。
【问题讨论】:
-
也许像这样?
(?<![ \t])\((?!if\s)([^()]*)\)regex101.com/r/zZgEFR/1
标签: c# regex regex-group