C# Regex匹配其他Regex不匹配的任何内容';不匹配
我使用正则表达式。我有下面的正则表达式,它符合我的所有要求: 很长-对不起。它用于解析任意对象的格式字符串。它使我能够指定属性(例如IntValue)并向其转发可选的子格式 它匹配一个C# Regex匹配其他Regex不匹配的任何内容';不匹配,c#,regex,C#,Regex,我使用正则表达式。我有下面的正则表达式,它符合我的所有要求: 很长-对不起。它用于解析任意对象的格式字符串。它使我能够指定属性(例如IntValue)并向其转发可选的子格式 它匹配一个,后跟一个可选的非捕获模式?:,后跟一个可选的“选项”模式(?r)或(?a-r)。然后,属性名后跟一对[] 对于以下输入: Int:#IntValue Bool:#BoolValue[]Word Str:“#StrValue”Double:#DoubleValue[#.00]#(#r)Bar[#(#r)StrVa
,后跟一个可选的非捕获模式?:
,后跟一个可选的“选项”模式(?r)
或(?a-r)
。然后,属性名后跟一对[]
对于以下输入:
Int:#IntValue Bool:#BoolValue[]Word Str:“#StrValue”Double:#DoubleValue[#.00]#(#r)Bar[#(#r)StrValue[#Length]
它匹配:
- #内在价值
- #布尔值
- #标准值
- #双值[#.00]
- #(?r)条[#(?r)标准值[#长度]]
id
或plain
是否有捕获来决定我的大小写)
默认模式是:((?!))*
在我的例子中,这看起来像(模式:|(?(?:(?!)+)
)
是什么导致了巨大的正则表达式(whitch maches完美):
普。它做它应该做的,但是
有没有其他方法来匹配以前的正则表达式部分不匹配的所有内容
清楚吗?你很幸运:你的正则表达式以一个锚字符开头,它是
#
。我们可以利用这一点
为该模式添加一个替代选项:|[^#]+
。这将消耗除#
字符以外的所有字符,将以#
开头的特殊情况保留在模式的第一部分。因此,#
字符将始终开始新的匹配
还有一个小问题:第一部分中有一个非可选的id
组,由两个\b
锚点包围,这意味着如果输入字符串中有一个#
,后面没有字母(比如说foo##bar
),模式的第二部分也不会匹配该#
这个问题的一个简单解决方案是在模式的末尾使用
|[^#]+|#
来解释此边缘情况。第三个#
案例只有在第一个案例失败时才会匹配。为什么不直接执行!regex.IsMatch(输入)代码>?@Rob,因为我解析了一个字符串。我需要所有的零件。某些部分与我的属性模式匹配。但现在我还需要所有其他的东西Regex.IsMatch
将只检查是否存在匹配项。是的,有多个匹配项。整个字符串将匹配regex.IsMatch
对我没有帮助。在模式中附加[^#]+
不是一个可以接受的解决方案吗?@lucastrezesniewski???哇!它似乎起作用了。看起来很简单。我必须思考一下,才能理解它为什么有效(确保它适用于所有情况)。@lucastrezesniewski Grrr。。你在我写评论的时候发表了你的评论。我想我明白了。是的,我想你是对的。(我什么都想要。)但我的属性模式总是以#
开头。这迫使交替使用另一种情况。由于正则表达式的贪婪性,这应该是可行的。请将您的评论作为答案发布。之后的所有内容都是可选的。没有。id
不是可选的,但是你的解释也可以。哦,对了,我一定看到了一个不在那里的?