3

我有一个在 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);
            }
4

2 回答 2

0

您可以使用正则表达式来检测带有附加引号的字符串:

(.+)(\s*".+"\s*)(.+)(\s*".+"\s*)(\s*".+"\s*)(.*)(\s*".+"\s*)(.+)

这将只匹配字符串,如

UnquotedStart"QuotedText1" UnquotedText "QuotetText2" "QuotetText3" ROUGETEXT "QuotetText4"   UnquotetEnd

您现在可以从匹配组中重建正确的字符串。

于 2012-07-19T16:31:59.677 回答
0

这个怎么样:

".*?".*?".*?".*?"(.*)"

基本符合

[ignore beginning]
[First Quote Pair]
[AnythingInBetween]
[Second Quote Pair]
[AnythingInBetween]
[Quote]
GROUPS YOUR FINAL STRING HERE until
[LastQuote in the line]

然后,您可以删除任何内部引号。

这是有效的,因为它对前两个引号对使用非贪婪正则表达式,然后对最终引号匹配使用贪婪正则表达式,因此最终匹配将忽略所有引号,直到达到最终引号。

于 2012-07-19T16:08:53.110 回答