我遇到了正则表达式的问题。我基本上需要将一个字符串与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将字符串结尾分隔符($)与字符串的美元($)匹配。如果我想匹配一美元,我应该逃脱它:\ $
任何帮助将不胜感激。 非常感谢。
答案 0 :(得分:3)
[...]
是一个字符类。通常,$
(以及*+?)[.(|
等许多其他字符)都是元字符。但是,当它们位于字符类中时,它们将成为文字字符。这意味着它们失去了特殊含义,因此字符类中的$
匹配$
,而不是字符串结尾。您可以使用等效的$
代替\Z
,但仍可在字符类中使用。
我不确定你要完成的是什么,但我认为你想要的正则表达式是
\d+=[^|]+
答案 1 :(得分:2)
嗯,您的$
位于[^...]
内。它不能代表该位置的字符串结尾,因此它认为您的意思是文字$
。
这个“通常”对你有用的原因是因为你根本不需要字符串结尾:)
"{0}(\d+)=([^{0}]*)"
*
是贪婪的,它会尽可能多地消耗掉所有字符,所以一切都很好:)