【问题标题】:regular expression for xml not workingxml的正则表达式不起作用
【发布时间】:2013-07-01 15:40:19
【问题描述】:

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

xml结构:

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

代码

    final String xmlString = "...";
    final List<String> data = new ArrayList<String>();
    try
    {
        final Pattern pattern = Pattern.compile("<company>(.+?)</company>", Pattern.DOTALL);
        final Matcher matcher = pattern.matcher(xmlString);
        while (matcher.find())
        {
            final Pattern pattern1 = Pattern.compile("<Employees>(.+?)</Employees>", Pattern.DOTALL);// "+?"
            final Matcher matcher1 = pattern1.matcher(matcher.group(1));
            if (matcher1.find())
            {
                data.add(matcher1.group(1));
            }
        }
    }
    catch (final Exception e)
    {

    }

如果 xml 字符串包含一个格式正确或格式不正确的 xml 字符串,这可以正常工作。 但是当您有一个格式不正确的 xml 后跟格式正确的 xml 时,这不起作用。

<company>
    <Employees>

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

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

请帮忙谢谢!!

【问题讨论】:

  • 呃……不,你做错了。 验证您的 XML 解析它之前。
  • 你的readBuilder 是什么?不应该是xmlString吗?
  • 您绝对需要验证您的 RegEx 实际上是正确的!请参阅this awesome tool 来完成此操作。另请记住,在某些情况下,您需要使用 \. 转义特殊字符
  • 是的 readBuilder 是 xmlString。已更新。
  • 如果格式不正确,您应该拒绝整个输入。 Trying to validate/parse XML (or HTML) with regex will fail,尤其是格式错误的 XML。

标签: java xml regex


【解决方案1】:

用一个正则表达式来做这件事永远行不通。

假设开始和结束标记出现在不同的行上,您需要一次处理一行 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
}

这是解决问题的一般思路...细节可以改进(留作练习)。

【讨论】:

  • 听完这里的回复后,我也在使用相同的模式。
  • 循环遍历字符串,直到找到结束标签,然后返回字符串,直到找到开始标签。同样做,直到我找到所有数据。
【解决方案2】:

您正在解析一种与 XML 相似但又不完全相同的语言。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-08
    • 2015-06-19
    • 1970-01-01
    • 2013-03-08
    • 2014-12-15
    相关资源
    最近更新 更多