我试图在输入字符串中找到每个“a - > b,c,d”模式。 我使用的模式如下:
"^[ \t]*(\\w+)[ \t]*->[ \t]*(\\w+)((?:,[ \t]*\\w+)*)$"
这种模式是C#模式,“\ t”指的是一个制表(它是一个单独的逃逸的文本,由.NET String API解释),“\ w”指的是众所周知的正则表达式预定义类,双重转义,由.NET STring API解释为“\ w”,然后由.NET Regex API解释为“WORD CLASS”。
输入是:
a -> b
b -> c
c -> d
功能是:
private void ParseAndBuildGraph(String input) {
MatchCollection mc = Regex.Matches(input, "^[ \t]*(\\w+)[ \t]*->[ \t]*(\\w+)((?:,[ \t]*\\w+)*)$", RegexOptions.Multiline);
foreach (Match m in mc) {
Debug.WriteLine(m.Value);
}
}
输出结果为:
c -> d
实际上,结尾为“$”特殊字符的行存在问题。如果我在“$”之前插入“\ r”,它可以工作,但我认为“$”将匹配任何行终止(使用Multiline选项),尤其是Windows环境中的\ r \ n。情况不是这样吗?
答案 0 :(得分:7)
这也让我感到惊讶。在.NET正则表达式中,$
在行分隔符之前不匹配,它在换行符之前匹配 - 字符\n
。这种行为与Perl的正则表达式一致,但在我看来,它仍然是错误的。 According to the Unicode standard,$
应该在以下之前匹配:
\n
,\r\n
,\r
,\x85
,\u2028
,\u2029
,\v
或\f
...并且永远不会在\r
和\n
之间匹配。 Java符合这一点(\v
和\f
除外),但是在Java之后很久出现的.NET,其Unicode支持至少与Java一样好,只能识别\n
。考虑到微软与该行分隔符的关联程度,你认为他们至少会正确处理\r\n
。
请注意.
遵循相同的模式:它与\n
不匹配(除非设置了单行模式),但 匹配\r
。如果您在正则表达式中使用了.+
而不是\w+
,则可能没有注意到此问题;回车将包含在匹配中,但是当您打印结果时,控制台会忽略它。
编辑:如果您想允许回车而不将其包括在结果中,您可以用前瞻替换锚点:(?=\r?\n
。
答案 1 :(得分:1)
您的意思是\t
作为正则表达式\t
还是C#\t
?我总是使用带有正则表达式的逐字字符串文字:
@"^[ \t]*(\w+)[ \t]*->[ \t]*(\w+)(,[ \t]*\w+)*$"
(你唯一需要逃脱的是"
到""
)
答案 2 :(得分:1)
通常在C,C ++,C#中,程序中的字符串使用“\ n”作为行分隔符。如果打开了textmode翻译,“\ r \ n”仅出现在I / O层。