Regex.IsMatch()没有识别转义序列?

时间:2012-05-02 22:04:28

标签: c# regex

我正在对一些转义字符串进行匹配比较:

Regex.IsMatch("\\Application.evtx", "DebugLogs\\ConfigurationServices.log");

我不明白我为什么会这样:

  

“解析”DebugLogs \ ConfigurationServices.log“ - 无法识别的转义序列\ C.”

\C是否被转义?

3 个答案:

答案 0 :(得分:4)

编辑真的欺骗了很多人,包括我!

'\'是正则表达式中的特殊字符 - effectively is an escape character or denotes an escape sequence

因此,RegEx引擎会看到DebugLogs * \ C * onfigurationServices.log,这确实是一个无法识别的转义序列。 \实际上是一个现有的转义序列。

所以你需要逃脱转义角色。最简单的方法是将所用斜杠的数量加倍:

Regex.IsMatch("\\\\Application.evtx", "DebugLogs\\\\ConfigurationServices.log");

RegEx引擎将在“\\ Appplication.evtx”和“DebugLogs \\ ConfigurationServices.log”之间进行比较 - 现在反斜杠已被转义且没有特殊含义。

Regex.IsMatch(@"\\Application.evtx", @"DebugLogs\\ConfigurationServices.log"); 

工作正常,更具可读性。

答案 1 :(得分:1)

\字符是字符串中的转义字符。例如,如果您想要回车,则使用\r。要解决这个问题,请使用文字字符串

@"\Application.evtx"

或逃避逃脱角色

"\\Application.evtx"

答案 2 :(得分:-2)

你可能想要

Regex.IsMatch(@"\Application.evtx", @"DebugLogs\ConfigurationServices.log");

没有“@”C#会将\ C视为一个转义序列,类似于将\ n转换为换行符的方式,但是\ C不是可识别/有效的转义序列。