我正在使用缓冲区流式传输 xml 文档。我将缓冲区设置得很低(50)以保持良好的性能。然后我使用缓冲字符串尝试从 xml 中提取根元素名称(在这种情况下,我需要下面的 xml 中的“abc”):
<?xml version="1.0"?>
<!--foobar-->
<!--<foo:bar></foo:bar>-->
<foo:abc xmlns:foo="url"><a><b>...
我应该只得到名字本身,没有别名。此外,应忽略注释中的处理指令和 xml 标签。当没有匹配时,我会让缓冲区变大并再次尝试匹配,直到找到根元素。
我创建了一个正则表达式,它正是这样做的,并返回根元素名称。使用 $4 的替换功能。但是,当正则表达式不匹配任何内容时,它会挂起很长时间来尝试解析模式......
(?s)(.*?(<!--.*?-->)?.*?)*<(.*?:)?([^!\?].*?)((\s+|/).*)?>.*
问题似乎出在试图匹配评论的部分
(.*?(<!--.*?-->)?.*?)*
但我无法弄清楚如何优化它,而不破坏它......有什么想法吗?