【问题标题】:How to write proper regex to recognize the XML content?如何编写正确的正则表达式来识别 XML 内容?
【发布时间】:2017-01-09 07:51:52
【问题描述】:

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

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 而不是使用正则表达式?
  • 帮自己一个忙,不要为此使用正则表达式。您似乎想要进行架构验证。也许这会对你有所帮助:docs.oracle.com/javase/tutorial/jaxp/dom/validating.html 请注意,我故意不写这个作为答案,因为它似乎是一个 X-Y 问题,并且该建议不能回答你的问题,但希望能解决你的问题。
  • @Baby 我不同意这个副本。他似乎没有尝试读取 XML 或从中获取值,而只是验证它。
  • 没错,我认为它不是重复的。
  • 忍不住链接到这个答案:stackoverflow.com/a/1732454/13075

标签: java regex xml


【解决方案1】:

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

我建议你去这里:XML validation Oracle Docs

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多