我有一个简单地检查文本文件中几个字符串的方法 - 尽管有些字符串没有作为匹配被选中,即使它们存在于文本文档中。我已经包含了在此示例中找不到的有问题的字符串:
static void Main(string[] args)
{
string str = @"1009 10.32.0.28 03/05/2012 09:11:48 The license expires in 1192 day(s).";
StreamReader sr = new StreamReader(@"event_history.txt");
string allRead = sr.ReadToEnd();
sr.Close();
string regMatch = str;
if (Regex.IsMatch(allRead, regMatch))
{
Console.WriteLine("found\n");
}
else
{
Console.WriteLine("not found\n");
}
Console.ReadKey();
}
event_history.txt
1009 10.32.0.28 03/05/2012 09:11:48 The license expires in 1192 day(s).
如果我用“测试”替换正则表达式匹配然后将“测试”添加到文本文件中,它会将其作为匹配选择它没有问题:S
答案 0 :(得分:1)
regMatch = str和str不是正则表达式。你为什么使用RegEx?你应该使用类似于
的东西".*The license expires in [0-9]* day(s).".
进一步说明,对于IP 10.23.0.28的所有条目:
"1009 10\.32\.0\.28 ..\/..\/.... ..\:..\:.. The license expires in [0-9]* day(s)."
使用文件regex.txt例如:
$ cat regex.txt
1009 10.32.0.28 03/05/2012 09:11:48 The license expires in 1192 day(s).
1009 10.32.0.28 04/05/2012 09:11:48 The license expires in 1192 day(s).
1009 10.32.0.29 04/05/2012 09:11:48 The license expires in 1192 day(s).
1009 10.32.0.30 04/05/2012 09:11:48 The license expires in 1192 day(s).
结果是:
$ grep "1009 10\.32\.0\.28 ..\/..\/.... ..\:..\:.. The license expires in [0-9]* day(s)." regex.txt
1009 10.32.0.28 03/05/2012 09:11:48 The license expires in 1192 day(s).
1009 10.32.0.28 04/05/2012 09:11:48 The license expires in 1192 day(s).
如果这是您要检查的字符串(1009,1192天,IP地址和日期 总是静止的。)
使用:
".... 10\.32\.0\.28 04\/05\/2012 ..\:..\:.. The license expires in 1192 day(s)."
答案 1 :(得分:1)
str
并不是您要完成的正确的正则表达式。例如,.
表示任何字符,s
周围的括号是分组,不会被捕获。您实际上只需检查allRead
是否包含str
,如果这是您要检查的字符串(1009,1192天,IP地址和日期始终是静态的)。
string str = @"1009 10.32.0.28 03/05/2012 09:11:48 The license expires in 1192 day(s).";
StreamReader sr = new StreamReader(@"event_history.txt");
string allRead = sr.ReadToEnd();
if(allRead.Contains(str))
{
Console.WriteLine("found\n");
}
else
{
Console.WriteLine("not found\n");
}
如果您正在寻找捕获非静态值的正则表达式,请转到
string str = @"\d+ \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3} \d{2}/\d{2}/\d{4} \d{2}:\d{2}:\d{2} The license expires in \d+ day\(s\)\.";
答案 2 :(得分:0)
您使用Regex.IsMatch
作为String.Contains
。正则表达式有自己的语法,因此不起作用(通常)。
在您的特定示例中,您需要转义s
周围的parantheses,因为正则表达式引擎在它们现在被写入时将不匹配它们,它们是捕获运算符。点也应该被逃脱,虽然具有讽刺意味的正则表达点确实匹配点。所以:
string str = @"1009 10\.32\.0\.28 03/05/2012 09:11:48 The license expires in 1192 day\(s\)\.";
答案 3 :(得分:0)
正则表达式不匹配的原因是因为(和)是正则表达式中的特殊字符。它们代表一个分组,一个您想稍后引用的值。要将它们更改为常规字符,请在它们前面添加\ right。所以你的正则表达式看起来像
@"1009 10.32.0.28 03/05/2012 09:11:48 The license expires in 1192 day\(s\)."