最近由于工作需要,学习了一些关于正则表达式方面的知识,主要是关于如何用C#去log文件中(txt格式)搜索匹配想要的信息,在这里把自己写的一些东西记录一下。我主要是要匹配log中包含的一些信息:
BEGIN RUN: 7/12/2011, 12:56:58 PM
... ...
Passed Tests: 7
Failed Tests: 2
... ...
Ignored Verifications: 0
Total Execution Time: 9m 11s
... ...
具体方法如下:
public static void GetInfo(string logPath,out String[] value) //logpath是存放log的路径, value是获取到相应的字符串后将其输出
{
value=new string[5]; //我需要匹配搜索的字符串有5个
using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read)) //打开log文件
{
using (StreamReader sr = new StreamReader(fs))
{
string[] lineArray = sr.ReadToEnd().Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries); //存储log一共有多少行
// Define regex to search info from .log
Regex rx1 = new Regex(@".?(\d{1,2}/\d{1,2}/\d{4}, \d{1,2}:\d{1,2}:\d{1,2} \wM)", RegexOptions.IgnoreCase); //为了搜索匹配BEGIN RUN: 7/12/2011, 12:56:58 PM 这个字符串中的时间7/12/2011, 12:56:58 PM
Regex rx2 = new Regex(@"Passed Tests:\s+\d{1,3}", RegexOptions.IgnoreCase); //为了搜索匹配Passed Tests: 7这个字符串中的数字
Regex rx3 = new Regex(@"Failed Tests:\s+\d{1,3}", RegexOptions.IgnoreCase); //为了搜索匹配 Failed Tests: 2这个字符串中的数字
Regex rx4 = new Regex(@"Ignored Verifications:\s+\d{1,3}", RegexOptions.IgnoreCase); //为了搜索匹配 Ignored Verifications: 0这个字符串中的数字
Regex rx5 = new Regex(@"Total Execution Time:\s+\d{1,2}m+ \d{1,2}s|Total Execution Time:\s+\d{1,2}m", RegexOptions.IgnoreCase); //为了搜索匹配 Total Execution Time: 9m 11s这个字符串中的时间
foreach (string line in lineArray) //逐行进行遍历
{
if (rx1.Match(line).Success) //如果找到符合rx1条件的字符串
{
val[0] = rx1.Match(line).Value; //把字符串的值赋给value
}
if (rx2.Match(line).Success)
{
val[1] = rx2.Match(line).Value.Substring(17); //从第一个字母p开始算起7的index是17(包括了空格)
}
if (rx3.Match(line).Success)
{
val[2] = rx3.Match(line).Value.Substring(17);
}
if (rx4.Match(line).Success)
{
val[3] = rx4.Match(line).Value.Substring(23);
}
if (rx5.Match(line).Success)
{
val[4] = rx5.Match(line).Value.Substring(23);
}
}
}
}
}
由于很多文章都只介绍了一些常用的正则,像邮编,电话之类的,所以在这里把我自己遇到的一个具体的例子记录下,怎么去做全文匹配,查找字符串,传值,供自己学习用。