【问题标题】:regex vs substring正则表达式与子字符串
【发布时间】:2015-07-13 22:48:40
【问题描述】:

我有一个非常短的 xml 字符串从另一个应用程序传递给我的应用程序,我只对提取“级别”标签之间的内容感兴趣。这两者之间哪个解决方案更好:

String xmlString = 
"<type>
<perm>
<date>99999999</date>
<level>admin</level>
</perm>
</type>";

String level = xmlString.substring(xmlString.indexOf("<level>") + "<level>".length(),
                            xmlString.indexOf("</level>"));

 Pattern p1 = Pattern.compile("<level>(\\S+)</level>");
 Matcher m = p1.matcher(xmlString);
 if (m.find()) {
   String level = m.group(1);
 }

【问题讨论】:

  • 最佳解决方案是第三个:使用 XML 解析器。
  • 这不是一个真正的 xml 文件,没有经过验证,没有 doctype...而且由于我无法控制它,我宁愿将其视为字符串...。Xpath 用于由于这个错误,会导致“prolog 中不允许的内容”和“SAX:解析时可能无法调用解析”错误:bugs.openjdk.java.net/browse/JDK-8047329

标签: regex xml-parsing substring


【解决方案1】:

您是否尝试过自己对此进行基准测试?从我读过的内容看来,您通常想先使用正则表达式,如果无法优化,请尝试使用子字符串。但是我有点困惑,为什么您不使用 XmlObject.factory 之类的东西来处理您的 XML 解析。 https://xmlbeans.apache.org/docs/2.0.0/reference/org/apache/xmlbeans/XmlObject.Factory.html

【讨论】:

  • 如果由我决定,这个字符串将是一个对象而不是 xml,但由于它不是经过验证的 xml,我只需要阅读其中的一行,我宁愿将其视为字符串,特别是因为将其解析为 xml 会导致大量问题和并发问题。我用多线程测试了这两种方法,子字符串方法比正则表达式略快,但两者都比用 Xpath 工厂解析要快得多,这在过去被证明是不可靠的。
  • 如果它对你表现最好,我会选择子字符串。对我来说,它似乎比正则表达式更容易维护,所以它是两全其美的。
猜你喜欢
  • 1970-01-01
  • 2022-01-17
  • 1970-01-01
  • 2019-04-17
  • 1970-01-01
  • 2012-08-07
  • 2011-04-06
  • 2021-09-19
  • 2011-12-29
相关资源
最近更新 更多