7

首先,我知道这是一个糟糕的解决方案,我不应该这样做。

背景:随意跳过


但是,我需要快速修复实时系统。我们目前有一个数据结构,它通过一系列字符串构建器创建“xml”片段,将自身序列化为字符串。这是否是有效的 XML 我相当怀疑。创建此 xml 之后,在通过消息队列发送它之前,一些清理代码会搜索字符串以查找 xml 声明的出现并删除它们。

这样做的方式(迭代每个执行 indexOf 的字符<?xml)非常慢,导致线程超时并杀死我们的系统。最终,我将尝试正确解决此问题(使用 xml 文档或类似的东西构建 xml),但今天我需要一个快速修复来替换那里的内容。

请记住,我知道这远非理想的解决方案,但我需要快速修复以使我们恢复正常运行。


问题

我想使用正则表达式来查找声明。我打算:<\?xml.*?>,然后使用Regex.Replace(input, string.empty)删除。

您能否让我知道这个正则表达式是否有任何明显的问题,或者只是在代码中使用string.IndexOf("<?xml")string.IndexOf("?>")在(更明智的)循环中配对会更好。

编辑 我需要照顾换行符。

会:<\?xml[^>]*?>做这个把戏?

编辑2

谢谢您的帮助。正则表达式明智地<\?xml.*?\?>工作得很好。我最终编写了一些计时代码并使用 ar egex 和IndexOf(). 我发现,对于我们最简单的用例,只需要声明剥离:

  • 几乎一秒钟
  • 0.01 秒的正则表达式
  • 不合时宜的使用循环和IndexOf()

所以我选择了IndexOf()一个非常简单的循环,因为它很容易。

4

2 回答 2

8

您可能想要 this:<\?xml.*\?>或 this: <\?xml.*?\?>,因为您现在拥有它的方式,正则表达式不是在寻找 '?>' 而只是寻找 '>'。我不认为你想要第一个选项,因为它很贪婪,它会删除第一次出现 '' 之间的所有内容。只要您没有嵌套的 XML 标记,第二个选项就可以工作。如果这样做,它将删除第一个“”之间的所有内容。如果你有另一个''标签。

此外,我不知道如何在.NET 中实现正则表达式,但我严重怀疑它们是否比使用 indexOf 更快。

于 2010-11-08T15:39:16.733 回答
-1
strXML = strXML.Remove(0, sXMLContent.IndexOf(@"?>", 0) + 2);
于 2016-01-19T11:26:43.120 回答