正则表达式从字符串中删除xml声明

xan*_*xan 4 c# regex xml tidy

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

背景:随意跳过


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

这样做的方式(迭代每个执行indexOf的字符<?xml)是如此之慢,导致线程超时并杀死我们的系统.最终我会尝试正确地修复它(使用xml文档或类似的东西构建xml)但是今天我需要快速修复以替换那里的内容.

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


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

如果这个正则表达式有任何明显的问题,或者是否只是在代码中使用string.IndexOf("<?xml")string.IndexOf("?>")(在更加理智的情况下)循环中编写它是更好的,你能告诉我吗?

编辑 我需要处理换行.

会:<\?xml[^>]*?>做的伎俩?

干杯!

EDIT2

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

  • 差不多一秒钟
  • 正则表达式的.01秒
  • 使用循环和不可估量 IndexOf()

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

干杯全都.

Jor*_*rdi 6

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

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