需要从一个以空格分隔的字符串的特定位置移除特定的引号,同时保留其他引号。

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个引号-以空格结尾的字符串
无效字符串总是遵循这个模式。

第一引用 - 开始字符串 第二引用 - 结束字符串后跟空格 第三引用 - 开始字符串 第四引用 - 结束字符串后跟空格 第五引用 - 开始字符串 第六引用 - 结束字符串没有空格 第七引用 - 开始字符串 第八引用 - 结束字符串后跟空格

我需要的是一种搜索字符串的方法,沿着引用位置寻找无效模式,并从第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);
            }
2个回答

0
这样怎么样:
".*?".*?".*?".*?"(.*)"

它基本上是匹配的

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

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

这样做的原因是使用了一个非贪婪的正则表达式来匹配前两个引号对,然后使用贪婪的正则表达式匹配最后的引号,使得最终匹配将忽略所有引号,直到达到最后一个引号。


0

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

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

这只会匹配像

这样的字符串。

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接