首先,我知道这是一个不好的解决方案,我不应该这样做。
背景:随时跳过
但是,我需要快速修复实时系统。当前,我们拥有一个数据结构,该数据结构可通过一系列字符串构建器创建“xml”片段,从而将自身序列化为字符串。我是否怀疑这是否是有效的XML。创建此xml之后,并在通过消息队列发送它之前,一些清理代码会在字符串中搜索xml声明的出现并将其删除。
完成此操作的方式(迭代每个字符对<?xml
进行indexOf)非常慢,导致线程超时并杀死我们的系统。最终,我将尝试正确地解决此问题(使用xml文档或类似文件构建xml),但今天我需要快速修复以替换其中的内容。
请记住,我知道这不是理想的解决方案,但是我需要快速修复才能使我们恢复正常运行。
问题
我的想法是使用正则表达式来查找声明。我正在计划:<\?xml.*?>
,然后使用Regex.Replace(input, string.empty)
删除。
您能否让我知道此正则表达式是否存在任何明显问题,或者仅在(更为精巧的)循环中使用string.IndexOf("<?xml")
和string.IndexOf("?>")
对将其编写为代码是否更好。
编辑
我需要照顾换行符。
会:<\?xml[^>]*?>
可以解决问题吗?
EDIT2
谢谢您的帮助。正则表达式明智的<\?xml.*?\?>
工作正常。我最终编写了一些计时代码,并使用ar egex和IndexOf()
进行了测试。我发现,对于我们最简单的用例,仅声明剥离就花了:
IndexOf()
因此,我选择了
IndexOf()
,因为这很容易,它是一个非常简单的循环。 最佳答案
您可能想要的是<\?xml.*\?>
或this:<\?xml.*?\?>
,因为您现在拥有的方式是,正则表达式不是在寻找'?>'而是在寻找'>'。我认为您不需要第一个选项,因为它很贪心,并且会删除第一次出现''之间的所有内容。只要您没有嵌套的XML标签,第二个选项就可以使用。如果这样做,它将删除第一个''之间的所有内容。如果您还有另一个“”标签。
另外,我不知道正则表达式如何在.NET中实现,但是我严重怀疑它们是否比使用indexOf更快。