Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# EOL特殊字符不匹配_C#_Regex - Fatal编程技术网

C# EOL特殊字符不匹配

C# EOL特殊字符不匹配,c#,regex,C#,Regex,我试图在输入字符串中找到每个“a->b,c,d”模式。 我使用的模式如下所示: "^[ \t]*(\\w+)[ \t]*->[ \t]*(\\w+)((?:,[ \t]*\\w+)*)$" 此模式是一种C#模式,“\t”表示一个表格(它是一个单转义的literal,由.NET字符串API解释),“\w”表示众所周知的regex literal预定义类,双转义由.NET字符串API解释为“\w”,然后由.NET regex API解释为“WORD类” 输入为: a -> b b -&

我试图在输入字符串中找到每个“a->b,c,d”模式。 我使用的模式如下所示:

"^[ \t]*(\\w+)[ \t]*->[ \t]*(\\w+)((?:,[ \t]*\\w+)*)$"
此模式是一种C#模式,“\t”表示一个表格(它是一个单转义的literal,由.NET字符串API解释),“\w”表示众所周知的regex literal预定义类,双转义由.NET字符串API解释为“\w”,然后由.NET regex API解释为“WORD类”

输入为:

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环境中。不是吗?

你是说
\t
作为正则表达式
\t
还是作为C#
\t
?我总是在正则表达式中使用逐字字符串文字:

@"^[ \t]*(\w+)[ \t]*->[ \t]*(\w+)(,[ \t]*\w+)*$"

(您唯一需要转义的是
)这也让我感到惊讶。在.NET正则表达式中,
$
在行分隔符之前不匹配,它在换行符之前匹配——字符
\n
。这种行为与Perl的正则表达式风格一致,但在我看来仍然是错误的。
$
应该在以下任何字符之前匹配:

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

…并且在
\r
\n
之间永远不匹配。Java遵守这一点(除了
\v
\f
),但.NET在Java之后很久才出现,其Unicode支持至少与Java一样好,它只识别
\n
。考虑到Microsoft与该行分隔符的关联程度,您可能认为它们至少能正确处理
\r\n

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


< >编辑:如果你想让回车不包含在结果中,你可以用一个前瞻来替换锚:<代码>(.= r \ \\n\/COD> ./P>> p>一般在C、C++、C中,程序中的字符串使用“\n”作为行分隔符。“如果启用了textmode translations,则仅在I/O层显示。

实际上\t指的是表格。我不想使用\\s作为空白字符,因为我不想让用户输入行尾,只允许使用空格和表格。但我的问题与简化模式“^(\\w+)->(\\w+)(?:,\\w+)$”相同.我更新了原始问题。@Aurélien-是的,但是如果没有逐字字符串文字,正则表达式根本看不到
\t
。@Marc Gravell-它是一个制表符或空格选项,除非正则表达式不允许嵌入制表符,否则它的字面意思是制表符,而不是空格\t@Guvante是正确的:正则表达式编译器看到一个文本制表符,这就是它与什么匹配(我测试了它)。在您的版本中,它会看到序列
\t
,即制表符的转义序列;这两种方式都可以。@Aurélien:如果您真的需要一个带制表符的字符串,请使用旧式文字。但是为了将制表符与正则表达式匹配,反斜杠-'t'也可以,正如我所说的那样。这一点很好。我总是感到惊讶,这种情况很少出现sue提出了这个问题,我想这是原因之一。但我仍然认为他们不使用Unicode标准是错误的。\r\n是Microsoft的行终止符。例如,Notepad.exe不识别“\n”终止符,只识别“\r\n”。对于Unix用户,“\n”是通常的行终止符,对于Mac用户,“\r”就是这样。这是一个愚蠢的混乱?我同意:-)\r\n是文本文件中的行终止符(在Windows中)\n是代码中的终止符。当且仅当您以“文本模式”打开文件时,I/O层才会在它们之间转换。谢谢您的回答。事实上,这是一个令人惊讶的结论:)奇怪的是,是否有一个标志可以设置为使系统与c/c++中的O_二进制标志一样匹配数据。我终于找到了这个问题的答案,他们提供的唯一方法是在锚之前加上
\r?
:可能很难相信,特别是来自主要操作系统的开发人员,他们使用\r\n换行符,但肯定是真的。我建议的解决方法是首先从输入字符串中删除所有\r。