当前位置: 首页 > 知识库问答 >
问题:

需要删除空格分隔字符串中特定位置的特定引号,同时保留其他引号

孟鹤龄
2023-03-14

我有一个用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个引号,每个偶数引号后面都有一个空格。

第一个引号-开始字符串第二个引号-结束字符串,第三个引号后面有空格-开始字符串第四个引号-结束字符串,第五个引号后面有空格-开始字符串第六个引号-结束字符串,后面有空格

无效字符串将始终遵循此模式。

第一个报价-开始字符串第二个报价-结束字符串与空间以下第三个报价-开始字符串第四个报价-结束字符串与空间以下第五个报价-开始字符串第六个报价-结束字符串没有空间以下第七个报价-开始字符串第八个报价-结束字符串与空间跟踪

我需要的是一种搜索字符串的方法,以便沿着引号位置查找无效的模式,并从第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个答案

西门高歌
2023-03-14

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

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

这只能和像

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

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

艾雪风
2023-03-14

这个怎么样:

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

基本吻合

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

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

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

 类似资料:
  • 问题内容: 我有一个像这样的字符串: 我正在尝试在Python中编写一些内容,以按空格将其拆分,同时忽略引号内的空格。我正在寻找的结果是: PS。我知道你会问:“如果引号内有引号,那么在我的应用程序中,将永远不会发生。 问题答案: 你需要从内置模块中。 这应该正是你想要的。

  • 我想通过以下方式删除字符串的最后一个后面的部分: 或者 到目前为止,我已经尝试过了(工作) 输出: 或 我是python的初学者,所以很好奇有没有其他方法可以做到这一点。

  • 我只需要删除特定字符之间的一些空格。这是我的数据: 我希望删除两个##标签之间的所有空白,这些空白除了数字之外没有任何其他分隔。我的数据应该如下所示: 我目前正在尝试在PHP中使用以下正则表达式来preg_replace这些空格,但是,我尝试过的所有内容都失败了。 调试演示

  • 问题内容: 例如,我正在从文本文件中提取文本String,我需要这些词来形成数组。但是,当我执行所有这些操作时,有些单词以逗号(,)或句号(。)结尾,甚至附有括号(这完全是正常现象)。 我要做的是摆脱那些角色。我一直在尝试使用Java中的预定义String方法来做到这一点,但我还是无法解决。 问题答案: 用: replaceAll采用正则表达式。这个: …寻找每个逗号和/或句号。

  • 问题内容: 我有从.net应用程序A,B,C,D,E,F获取的字符串, 我想写一个SQL选择语句像 这在t-SQL中将不起作用,因为它使用不将值分开的一个字符串。有什么办法可以做到这一点? 问题答案: 它认为最简单的方法是动态SQL生成:

  • 问题内容: 我正在Java中的一个需要嵌套字符串的项目中工作。 对于纯文本形式的输入字符串,如下所示: 这是“字符串”,这是“ \嵌套”字符串 结果必须为以下内容: 请注意 ,我希望保留序列。 我有以下方法: 而且我需要根据给定的规则从给定的参数中创建一个字符串数组,而不使用 Java Collection Framework 或其派生类。 我不确定如何解决这个问题。 可以做一个正则表达式来解决这