[ \t]*(\\w+)((?:,[ \t]*\\w+)*)$" 这个模式-6ren">
gpt4 book ai didi

c# - EOL 特殊字符不匹配

转载 作者:太空狗 更新时间:2023-10-30 00:28:34 25 4
gpt4 key购买 nike

我试图在输入字符串中找到每个“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”,它会起作用,但我认为“$”会匹配任何行终止符(使用多行选项),尤其是 Windows 环境中的\r\n。不是这样吗?

最佳答案

这也让我很吃惊。在 .NET 正则表达式中,$行分隔符之前不匹配,它在换行符之前匹配——字符 \n 。这种行为与 Perl 的正则表达式风格一致,但在我看来它仍然是错误的。 According to the Unicode standard , $ 应该在以下任何一个之前匹配:

\n, \r\n, \r, \x85, \u2028 \u2029\v\f

...并且从不匹配 \r\n。 Java 符合这一点(\v\f 除外),但是 .NET,它出现在 Java 之后很久,它的 Unicode 支持至少和 Java 一样好,只识别 \n。你会认为他们至少会正确处理 \r\n,考虑到 Microsoft 与该行分隔符的关联程度有多强。

请注意 . 遵循相同的模式:它不匹配 \n(除非设置了单行模式),但它匹配 匹配 \r。如果您在正则表达式中使用 .+ 而不是 \w+,您可能没有注意到这个问题;回车会包含在匹配中,但当您打印结果时控制台会忽略它。

编辑:如果您想允许回车而不将其包含在结果中,您可以用前瞻性替换 anchor :(?=\r?\n

关于c# - EOL 特殊字符不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2480533/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com