正则表达式匹配任何另一个正则表达式不匹配

时间:2015-12-03 12:36:57

标签: c# regex

我正在使用正则表达式。我的以下正则表达式符合我的要求:

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

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

它匹配#后跟可选的非捕获模式?:,后跟可选的&#39;选项&#39;模式(?r)(?a-r)。然后是属性名称,后跟一对[]

对于以下输入:

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

匹配:

  • #IntValue
  • #BoolValue []
  • #StrValue
  • #DoubleValue [#00]
  • #(ΔR)酒吧[#(ΔR)strValue中[#Length]]

精细。

但现在我需要所有其他的东西。我想在相同的正则表达式中能够预测所有匹配(我可以通过检查idplain是否有捕获来判断我的情况。)

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

在我的情况下看起来像(模式:<REG>|(?<plain>(?:(?!<REG>).)+)) 什么导致巨大的正则表达式(完美的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。它做了它应该做的但是......

还有其他方法可以匹配以前的正则表达式部分所没有的所有内容吗?

这是清楚的吗?

1 个答案:

答案 0 :(得分:2)

你很幸运:你的正则表达式以一个锚字符开始,即augtool> ls /files/etc/shadow augtool> print /files/etc/shadow augtool> 。我们可以利用这一点。

添加模式的替代方案:#。这将消耗除|[^#]+个字符以外的所有字符,将特殊情况从#开始到模式的第一部分。因此,#字符将始终开始新匹配。

还有一个小问题:你的第一部分中有两个#锚定所包围的非可选id组,这意味着你有一个\b在输入字符串中没有后跟一个字母(让我们说#之类的东西),foo#!bar不会被模式的第二部分匹配。< / p>

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