我是一名有用的助手,可以为您翻译以下内容:我有一个在C#中运行的Windows命令行程序,它在服务器上读取日志文件。这些日志文件是以空格分隔的(我们无法更改此设置),包含类似于以下内容的记录:
74.57.205.141 - - [30/Mar/2012:00:03:04 +0000] "GET /7/961/148606/v1/00.akacast.akamaistream.net/00-radio-128" 200 1758815 "-" "iTunes/10.5.3 (Windows; Microsoft Windows 7 x64 "R2" Business Edition Service Pack 1 (Build 7601)) AppleWebKit/534.52.7" 102
在用户代理字符串的开头,可以找到“/iTunes”。这个字符串应该一直到AppleWebKit/534.52.7才结束。问题在于,对于某些用户代理字符串,会插入一个错误的引号。在这个例子中,这个错误的引号是"R2"。
然而,并不总是R2,其他一些代理字符串也可能会插入额外的引号,因此我不能只用R2替换"R2"。
我能想出的有效字符串模式是,总共有6个引号,每个偶数引号后面都有一个空格。
第1个引号-开始字符串 第2个引号-以空格结尾的字符串 第3个引号-开始字符串 第4个引号-以空格结尾的字符串 第5个引号-开始字符串 第6个引号-以空格结尾的字符串
无效字符串总是遵循这个模式。
第一引用 - 开始字符串 第二引用 - 结束字符串后跟空格 第三引用 - 开始字符串 第四引用 - 结束字符串后跟空格 第五引用 - 开始字符串 第六引用 - 结束字符串没有空格 第七引用 - 开始字符串 第八引用 - 结束字符串后跟空格
我需要的是一种搜索字符串的方法,沿着引用位置寻找无效模式,并从第6和第7个位置中删除引号。 我想一个好的正则表达式可能会起作用,但我不太擅长使用它们,还没有想出任何有效的解决方案,更不用说正则表达式不能从第6和第7个位置中删除那些引号。
编辑
这可能过于简单,但我通过进行一些索引操作来解决我的特定问题。 不幸的是,我无法让正则表达式解决我的问题 :(
工作代码:
string str = "74.57.205.141 - - [30/Mar/2012:00:03:04 +0000] \"GET /7/961/148606/v1/00.akacast.akamaistream.net/00-radio-128\" 200 1758815 \"-\" \"iTunes/10.5.3 (Windows; Microsoft Windows 7 x64 \"R2\" Business Edition Service Pack 1 (Build 7601)) AppleWebKit/534.52.7\" 102";
int[] indexes = Enumerable.Range(0, str.Length).Where(x => str[x] == '"').ToArray();
if (indexes.Length > 6)
{
//need to remove extra quotes from the 6th position and 7th position.
//remove the 7th position first to prevent the index from changing on the quotes we need to remove.
str = str.Remove(indexes[6], 1).Remove(indexes[5], 1);
}