2015-12-03 210 views
2

我坚定地使用正则表达式。我下面的正则表达式匹配所有我想:正则表达式匹配任何其他正则表达式不匹配

#(?<nonCapturing>\?\:)?(?:\(\?(?![\)])(?<addOpt>[ar]*)(?:\-(?<remOpt>[ar]+))?\))?\b(?<id>\w+)\b(?:\[\]|(?:(?=\[)(?:[^\[\]]|(?<open>\[)|(?<subFormat-open>\]))+?(?(open)(?!))))?

很长 - 对不起。它用于解析任意对象的格式字符串。它使我能够指定一个属性(例如IntValue)并将可选的子格式转发给它。

它相匹配的#接着任选的非捕获图案?:,接着任选的“选项”图案(?r)(?a-r)。然后是属性名称后跟一对[]

对于以下输入:

Int: #IntValue Bool: #BoolValue[]Word Str: '#StrValue' Double: #DoubleValue[#.00] #(?r)Bar[#(?r)StrValue[#Length]]

它匹配:

  • #IntValue
  • #BoolValue []
  • #StrValue
  • #DoubleValue [#00 ]
  • #(?r)Bar [#(?r)StrValue [#Length]]

好。

但现在我需要所有其他的东西。我希望它在同一个正则表达式中能够对所有匹配进行foreach(我可以通过检查idplain是否具有捕获来决定是否有这种情况)。

默认模式做的就是:((?!<regex that matches what you want>).)*

在我的情况下,将看起来像(图案:<REG>|(?<plain>(?:(?!<REG>).)+)) 什么resuls在那巨大的正则表达式(whitch maches完美):

(?:#(?<nonCapturing>\?\:)?(?:\(\?(?![\)])(?<addOpt>[ar]*)(?:\-(?<remOpt>[ar]+))?\))?\b(?<id>\w+)\b(?:\[\]|(?:(?=\[)(?:[^\[\]]|(?<open>\[)|(?<subFormat-open>\]))+?(?(open)(?!))))?)|(?<plain>(?:(?!(?:#(?<nonCapturing>\?\:)?(?:\(\?(?![\)])(?<addOpt>[ar]*)(?:\-(?<remOpt>[ar]+))?\))?\b(?<id>\w+)\b(?:\[\]|(?:(?=\[)(?:[^\[\]]|(?<open>\[)|(?<subFormat-open>\]))+?(?(open)(?!))))?)|(?<plain>(?:(#(?<nonCapturing>\?\:)?(?:\(\?(?![\)])(?<addOpt>[ar]*)(?:\-(?<remOpt>[ar]+))?\))?\b(?<id>\w+)\b(?:\[\]|(?:(?=\[)(?:[^\[\]]|(?<open>\[)|(?<subFormat-open>\]))+?(?(open)(?!))))?).)+)).)+)

Puh。它做它应该但是...

是否有任何其他方式来匹配所有不匹配的先前的正则表达式部分?

这是明确的吗?

+0

为什么不只是'!regex.IsMatch(input);'? – Rob

+0

看起来没有办法,除非你想尝试PCRE.net,在那里你可以使用PCRE'(* SKIP)(* F)'动词。不过,这将是一个漫长的正则表达式。也许,你可以匹配第一种类型的子串,然后使用它们来分割剩下的东西?因为我解析了一个字符串,所以@Rob是 –

+1

。我需要所有的部分。有些部件符合我的财产模式。但现在我需要所有其他的东西。 'Regex.IsMatch'只会检查是否匹配。是的,有多个匹配。整个字符串将被匹配。 'regex.IsMatch'不会帮助我。 –

回答

2

你很幸运:你的正则表达式以主角字符开头,即#。我们可以利用这一点。

添加模式的替代品:|[^#]+。这将消耗除#个字符以外的所有内容,将特殊情况从#开始,保留到模式的第一部分。一个#角色因此总是会开始一场新的比赛。

仍然有轻微的陷阱:你有一个非可选id组由两个\b锚在第一部分所包围,这意味着如果你在输入字符串#未后面有一个字母(让我们说些什么如foo#!bar),#也不会与模式的第二部分匹配。

解决此问题的一个简单方法是在模式末尾使用|[^#]+|#来解释此边缘情况。只有第一种情况失败时,第三种#情况才会匹配。

+0

_之后的所有内容都是可选的._否。“id”不是可选的,但您的解释也适用。 –

+0

哦,对,我一定见过一个不在那里的'?' –