我使用的正则表达式存在问题,但不知道如何继续使用它们。我收到错误“无法识别的转义序列”。
我正在尝试列出所有可能具有以下代码中列出的格式的电话号码的文件
static void Main(string[] args)
{
//string pattern1 = "xxx-xxx-xxxx";
//string pattern2 = "xxx.xxx.xxxx";
//string pattern3 = "(xxx) xxx-xxxx";
string[] fileEntries = Directory.GetFiles(@"C:\BTISTestDir");
foreach (string filename in fileEntries)
{
StreamReader reader = new StreamReader(filename);
string content = reader.ReadToEnd();
reader.Close();
string regexPattern1 = "^(\d{3}\.){2}\d{4}$";
string regexPattern2 = "^((\(\d{3}\) ?)|(\d{3}-))?\d{3}-\d{4}$";
if(Regex.IsMatch(content, regexPattern1))
Console.WriteLine("File found: " + filename);
if(Regex.IsMatch(content, regexPattern2))
Console.WriteLine("File found: " + filename);
}
Console.WriteLine(Environment.NewLine + "Finished");
Console.ReadLine();
}
非常感谢任何帮助。
答案 0 :(得分:62)
使用@
使字符串不再使用转义字符\
:
string regexPattern1 = @"^(\d{3}\.){2}\d{4}$";
string regexPattern2 = @"^((\(\d{3}\) ?)|(\d{3}-))?\d{3}-\d{4}$";
作为旁注,我想你希望最后两个if
是一个if
,在这两个条件之间有一个或(||
)。
答案 1 :(得分:7)
添加额外的'\'以转义逃脱。当它被处理时,它将以你想要的方式解释。
答案 2 :(得分:3)
问题不在于正则表达式,而在于字符串。在通过调用IsMatch()将其编译为正则表达式之前,您输入的文本仍然是普通字符串,并且必须遵守语言规则。
您的语言中的\ d不是可识别的转义序列,因此错误。你可以使用双反斜杠(\是获取a的转义序列),或者,正如Blindy所指出的那样,你可以在你的常量字符串前加上@,告诉编译器它不应该尝试解释看起来像转义序列的任何东西