.NET Regex问题:字符串结尾字符串匹配字符串的美元

时间:2014-02-04 16:17:52

标签: .net regex

我遇到了正则表达式的问题。我基本上需要将一个字符串与Chr(1)分开作为分隔符,每个组的格式为key = value(其中key是数字)。字符串的开头是3-char代码,不会与Regex一起收集。 例如:

031|0=2013/12/04 00:03:35|400=lr5ulz1jxg8ss|3=SFE|4=2$1NNR|6=1

所以我使用了以下Regexp:

Private Shared _RegexDeserialize As New Regex(String.Format("{0}(\d+)=([^${0}]*)", Chr(1)))

但是当价值部分有一美元($)时,其余部分不匹配。

然后我使用了以下内容:

Private Shared _RegexDeserialize As New Regex(String.Format("{0}(\d+)=([^{0}]*)", Chr(1)))

我不明白为什么我以前的Regex无法正常工作以及为什么VB.Net将字符串结尾分隔符($)与字符串的美元($)匹配。如果我想匹配一美元,我应该逃脱它:\ $

任何帮助将不胜感激。 非常感谢。

2 个答案:

答案 0 :(得分:3)

[...]是一个字符类。通常,$(以及*+?)[.(|等许多其他字符)都是元字符。但是,当它们位于字符类中时,它们将成为文字字符。这意味着它们失去了特殊含义,因此字符类中的$匹配$,而不是字符串结尾。您可以使用等效的$代替\Z,但仍可在字符类中使用。

我不确定你要完成的是什么,但我认为你想要的正则表达式是

\d+=[^|]+

此处示范:http://regex101.com/r/rI4tM3

答案 1 :(得分:2)

嗯,您的$位于[^...]内。它不能代表该位置的字符串结尾,因此它认为您的意思是文字$

这个“通常”对你有用的原因是因为你根本不需要字符串结尾:)

"{0}(\d+)=([^{0}]*)"

*是贪婪的,它会尽可能多地消耗掉所有字符,所以一切都很好:)