我有一个在 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 引号 - 结束字符串,后面有空格
无效字符串将始终遵循此模式。
第 1 引号 - 起始字符串 第 2 引号 - 结束字符串,后面有空格 第 3 引号 - 起始字符串 第 4 引号 - 结束字符串,后面有空格 第 5 引号 - 起始字符串 第 6 引号 - 结束字符串,第 7 引号后面没有空格 - 起始字符串 第 8 引号 - 结束字符串空间跟随
我需要的是搜索字符串以沿着引号位置查找该无效模式并从第 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);
}