【发布时间】:2015-12-03 12:36:56
【问题描述】:
我坚定地使用正则表达式。我有以下匹配所有我想要的正则表达式:
很长-抱歉。它用于解析任意对象的格式字符串。它使我能够指定一个属性(例如 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]]
很好。
但现在我需要所有其他的东西。我希望它在同一个正则表达式中能够遍历所有匹配项(我可以通过检查 id 或 plain 是否有捕获来决定我有哪些情况)。
这样做的默认模式是:((?!<regex that matches what you want>).)*
在我的情况下看起来像(模式:<REG>|(?<plain>(?:(?!<REG>).)+))
那个巨大的正则表达式的结果是什么(完美匹配):
呸。它做了它应该做的,但是......
有没有其他方法可以匹配上一个正则表达式部分不匹配的所有内容?
清楚吗?
【问题讨论】:
-
为什么不直接做
!regex.IsMatch(input);? -
@Rob 因为我解析了一个字符串。我需要所有零件。有些部分符合我的属性模式。但现在我还需要所有其他的东西。
Regex.IsMatch只会检查是否匹配。是的,有多个匹配项。整个字符串将被匹配。regex.IsMatch帮不了我。 -
将
|[^#]+附加到模式不是可接受的解决方案吗? -
@LucasTrzesniewski ???哇!!!它似乎工作。它看起来很简单。我必须考虑它以了解它为什么起作用(以确保它适用于所有情况)。
-
@LucasTrzesniewski Grrr.. 在我写评论的时候你发表了你的评论。我想我明白了。是的,我认为你是对的。 (我想要一切。)但我的属性模式总是以
#开头。这迫使交替使用另一种情况。由于正则表达式的贪婪,这应该有效。请发表您的评论作为答案。