0

我有一个方法可以简单地检查一个文本文件中的几个字符串——尽管一些字符串没有被选为匹配项,即使它们存在于文本文档中。我已包含在此示例中未找到的违规字符串:

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).

如果我将正则表达式匹配替换为“testing”,然后将“testing”添加到文本文件中,它会将其作为匹配项进行选择,没问题:S

4

4 回答 4

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\)\.";
于 2012-05-03T14:37:18.247 回答
1

regMatch=str 和 str 不是正则表达式。你为什么使用正则表达式?你应该使用类似的东西

".*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)."
于 2012-05-03T14:34:36.907 回答
0

您正在使用Regex.IsMatchas String.Contains。正则表达式有自己的语法,因此(通常)不起作用。

在您的特定示例中,您需要转义 周围的括号s,因为正则表达式引擎不会像现在写的那样匹配它们,它们是捕获运算符。这些点也应该被转义,尽管具有讽刺意味的是正则表达式点确实匹配点。所以:

string str = @"1009 10\.32\.0\.28 03/05/2012 09:11:48 The license expires in 1192 day\(s\)\.";
于 2012-05-03T14:36:52.843 回答
0

正则表达式不匹配的原因是因为 ( 和 ) 是正则表达式中的特殊字符。它们代表一个分组,一个您想稍后引用的值。要将它们更改为常规字符,请在它们前面附加一个 \。所以你的正则表达式应该看起来像

@"1009 10.32.0.28 03/05/2012 09:11:48 The license expires in 1192 day\(s\)."
于 2012-05-03T14:41:02.140 回答