【问题标题】:Regex to match anything what another regex doesn't match正则表达式匹配任何其他正则表达式不匹配的内容
【发布时间】:2015-12-03 12:36:56
【问题描述】:

我坚定地使用正则表达式。我有以下匹配所有我想要的正则表达式:

#(?<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]]

很好。

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

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

在我的情况下看起来像(模式:<REG>|(?<plain>(?:(?!<REG>).)+)) 那个巨大的正则表达式的结果是什么(完美匹配):

(?:#(?<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)(?!))))?).)+)).)+)

呸。它做了它应该做的,但是......

有没有其他方法可以匹配上一个正则表达式部分不匹配的所有内容?

清楚吗?

【问题讨论】:

  • 为什么不直接做!regex.IsMatch(input);
  • @Rob 因为我解析了一个字符串。我需要所有零件。有些部分符合我的属性模式。但现在我还需要所有其他的东西。 Regex.IsMatch 只会检查是否匹配。是的,有多个匹配项。整个字符串将被匹配。 regex.IsMatch 帮不了我。
  • |[^#]+ 附加到模式不是可接受的解决方案吗?
  • @LucasTrzesniewski ???哇!!!它似乎工作。它看起来很简单。我必须考虑它以了解它为什么起作用(以确保它适用于所有情况)。
  • @LucasTrzesniewski Grrr.. 在我写评论的时候你发表了你的评论。我想我明白了。是的,我认为你是对的。 (我想要一切。)但我的属性模式总是以# 开头。这迫使交替使用另一种情况。由于正则表达式的贪婪,这应该有效。请发表您的评论作为答案。

标签: c# regex


【解决方案1】:

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

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

还有一个小问题:您有一个非可选的 id 组,在第一部分被两个 \b 锚点包围,这意味着如果您在输入字符串中有一个 # 后面没有跟字母(比如foo#!bar),# 也不会被模式的第二部分匹配。

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

【讨论】:

  • 之后的所有内容都是可选的。 不。id 不是可选的,但您的解释也有效。
  • 哦,对了,我一定见过?,但它不存在
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-01
  • 1970-01-01
  • 2021-10-29
相关资源
最近更新 更多