Java xml的正则表达式不起作用

Java xml的正则表达式不起作用,java,xml,regex,Java,Xml,Regex,我正在尝试编写一个正则表达式来匹配xml文档。我之所以不立即使用xml解析器,是因为该文件可能包含多个xml文件(格式正确与否),所以我希望在解析之前删除格式不正确的文件 xml结构: <company> ..... <Employees> ....... </Employees> </company> ..... ....... 代码 最终字符串xmlString=“…”; 最终列表数据=新的ArrayLis

我正在尝试编写一个正则表达式来匹配xml文档。我之所以不立即使用xml解析器,是因为该文件可能包含多个xml文件(格式正确与否),所以我希望在解析之前删除格式不正确的文件

xml结构:

<company>
    .....
    <Employees>
    .......
    </Employees>
</company>

.....
.......
代码

最终字符串xmlString=“…”;
最终列表数据=新的ArrayList();
尝试
{
最终模式=Pattern.compile((.+?)”,Pattern.DOTALL);
final Matcher Matcher=pattern.Matcher(xmlString);
while(matcher.find())
{
final Pattern pattern1=Pattern.compile((.+?)”,Pattern.DOTALL);/“+?”
最终匹配器matcher1=pattern1.Matcher(Matcher.group(1));
if(matcher1.find())
{
data.add(matcher1.group(1));
}
}
}
捕获(最终异常e)
{
}
如果xml字符串包含一个格式正确或格式不正确的xml字符串,则此方法可以正常工作。 但是,当您有一个格式不正确的xml后跟格式正确的xml时,这就不起作用了

<company>
    <Employees>

   </Employees>
<company>
    .....
    <Employees>
    .......
    </Employees>
</company>

.....
.......
在这种情况下,它返回的是整个字符串,而不是格式良好的xml

<company>
    <Employees>

   </Employees>
<company>
    .....
    <Employees>
    .......
    </Employees>
</company>

请帮忙,谢谢

使用单个正则表达式执行此操作永远不会起作用

假设开始标记和结束标记分别出现在不同的行上,则需要一次处理一行XML,跟踪所看到的内容并缓冲输入,直到识别出完整的有效子文档

伪代码:

buffer = ""
while (line = read_input)
{
    if tag=="<company>"
    {
        buffer = "" // discard whatever we have seen since it didn't end with </company>
        buffer += line
    }
    else if tag=="</company>"
    {
        buffer += line
        write buffer
        buffer = ""
    }
    else
        buffer += line
}
buffer=“”
while(行=读取输入)
{
如果标记==“”
{
buffer=”“//放弃我们所看到的,因为它没有以
缓冲区+=行
}
如果标记==“”,则为else
{
缓冲区+=行
写缓冲区
buffer=“”
}
其他的
缓冲区+=行
}

这是如何处理这个问题的总体思路。。。细节可以改进(留作练习)。

您正在解析一种类似于XML但不完全相同的语言

因此,您需要做的第一件事是指定该语言的语法:您的解析器将接受什么结构

然后您需要编写解析器。几乎可以肯定,您的语言的语法将是递归的,这意味着正则表达式无法解析它。您可以使用JavaCC等工具编写解析器


但是你需要做一些阅读。如果您试图使用正则表达式来完成这项工作,这表明您没有意识到正在解决的问题背后的基本计算机科学。如果你是一个聪明的黑客,你可能会在你的大多数输入文档中找到一些有用的东西,但除非你理解这个理论并应用它,否则它总是有可能在下一个文档中失败。

Uhh。。。不,你做错了。在解析XML之前验证它。什么是您的
readBuilder
?它不应该是
xmlString
?您确实需要验证您的正则表达式是否正确!请务必做到这一点。还请记住,在某些情况下,您需要使用\.yes readBuilder转义特殊字符。已更新。如果输入格式不正确,则应拒绝整个输入,尤其是格式糟糕的XML。在听了这里的响应后,我也使用了相同的模式。在字符串上循环,直到找到结束标记,然后返回字符串,直到找到开始标记。类似地,直到找到所有数据。