繁体   English   中英

如何编写正确的正则表达式来识别 XML 内容?

[英]How to write proper regex to recognize the XML content?

我有一些内容,我想知道它们是否是XML 怎么做 ? 我只需要从方法返回类型中知道答案是true还是false 我打算使用正则表达式,但愿意提供更好的建议。

XML内容如下,格式始终相同(可能是分子 ID 增加或减少),

<?xml version="1.0" encoding="UTF-8"?>
<molecules>
    <molecule id="1">
        <atoms>
            <atom id="1" symbol="C"/>
            <atom id="2" symbol="C"/>
            <atom id="3" symbol="N"/>
        </atoms>
        <bonds>
            <bond id="1" atomAId="1" atomBId="2" order="SINGLE"/>
            <bond id="2" atomAId="2" atomBId="3" order="DOUBLE"/>
        </bonds>
    </molecule>
     <molecule id="2">
        <atoms>
            <atom id="1" symbol="C"/>
            <atom id="2" symbol="C"/>
            <atom id="3" symbol="N"/>
        </atoms>
        <bonds>
            <bond id="1" atomAId="1" atomBId="2" order="SINGLE"/>
            <bond id="2" atomAId="2" atomBId="3" order="DOUBLE"/>
        </bonds>
    </molecule>
</molecules> 

我让正则Regex识别XML ,如下所示,

public static final String REGEX_FOR_XML = "((<(\\S(.*?))(\\s.*?)?>(.*?)<\\/\\3>)|(<\\S(.*?)(.*?)(\\/>)))";

问题是它只与内部内容匹配,而我想让整个内容匹配。 我使用这个验证器进行匹配,

public static boolean isValidXML(String inXMLStr) {

    if (inXMLStr == null || inXMLStr.isEmpty())
        return false;

    final Pattern pattern = Pattern.compile(Constants.REGEX_FOR_XML);
    if (pattern.matcher(inXMLStr).matches()) {
        return true;
    }
    return false;
}

如何更正正则Regex以与XML内容匹配或如何做更好的选择?

有一个关于使用正则表达式进行 XML 解析的臭名昭著的答案,我不会链接(@Henrik 无论如何都做了;P)或进入。 但底线:正则表达式很少是进行 XML 验证(或为此进行解析)的好主意。

我建议你去这里: XML 验证 Oracle Docs

我想这应该是你想要的。 看,在 Java 中,您可以使用 Schema-Validation 来验证 XML - 如果我正确阅读了问题,这就是您想要做的。

您需要做的是编写模式定义而不是正则表达式。 这不仅是“正确和直接”的方式,而且维护起来也容易得多。 这不是火箭科学,也不是火箭科学,而且您的架构似乎非常清晰,并且很容易浓缩到 xsd 中。 还有一些工具可以帮助您做到这一点。 不过,这些结果可能仍需进行微调。

注意:我知道在 SO 上不鼓励“仅链接”答案,但是资源太大而无法复制到答案中(至少恕我直言)。 此外,可能有代表 Oracle 的一些版权。 由于它是官方的 Oracle Docs,它也不应该容易出现“断开的链接”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM