我有一个在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个引号,每个偶数引号都有一个空格。
第一次引用 - 开始字符串 第二个引用 - 结束字符串,后跟空格 第三次引用 - 开始字符串 第4个引用 - 结束字符串,后跟空格 第五次引用 - 开始字符串 第6个引用 - 结束
后面的空格字符串无效字符串将始终遵循此模式。
第一次引用 - 开始字符串 第二个引用 - 结束字符串,后跟空格 第三次引用 - 开始字符串 第4个引用 - 结束字符串,后跟空格 第五次引用 - 开始字符串 第6个引用 - 结束字符串后面没有空格 第七个引用 - 开始字符串 第8个引用 - 结束
之后的空格字符串我需要的是搜索字符串以沿着引用位置向下寻找无效模式并从第6和第7位移除引号的方法。我认为一个好的正则表达式可能会起作用,但我对它们并不是很好,并且还没有提出任何有用的东西,更不用说正则表达式不会从第6和第7个位置删除那些引号。< / p>
修改 的
这可能过于简单了,但我能够通过做一些索引操作来解决我的特定问题。不幸的是,我无法让正则表达式解决方案为我工作:(
工作代码:
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);
}
答案 0 :(得分:0)
这个怎么样:
".*?".*?".*?".*?"(.*)"
它基本匹配
[ignore beginning]
[First Quote Pair]
[AnythingInBetween]
[Second Quote Pair]
[AnythingInBetween]
[Quote]
GROUPS YOUR FINAL STRING HERE until
[LastQuote in the line]
然后,你可以删除任何内部引号。
这是有效的,因为它对前两个引用对使用非贪婪的正则表达式,然后对最终引用匹配使用贪婪的正则表达式,因此最终匹配将忽略所有引号,直到达到最终引用。
答案 1 :(得分:0)
您可以使用正则表达式来检测带有其他引号的字符串:
(.+)(\s*".+"\s*)(.+)(\s*".+"\s*)(\s*".+"\s*)(.*)(\s*".+"\s*)(.+)
这只会匹配像
这样的字符串UnquotedStart"QuotedText1" UnquotedText "QuotetText2" "QuotetText3" ROUGETEXT "QuotetText4" UnquotetEnd
您现在可以从匹配的组中重建正确的字符串。