0

我有一个包含如下文本的 xml 文件:

<text top="84" left="97" width="737" height="32" font="0">SmartFS-A Serverless Distributed       File System for</text>
<text top="126" left="371" width="187" height="32" font="0">Smartphones</text>
<text top="217" left="253" width="424" height="15" font="1">Sonali Batra,Vijay Raghunathan and Mithun Kumar Rajendran</text>
<text top="237" left="325" width="281" height="13" font="2">School of Computer Science and Engineering</text>

我正在尝试使用正则表达式提取第一行作为除每个 XML 文件的字体更改之外的所有内容。我目前正在使用但总是返回 false 的正则表达式是:

if (xml.matches("<text top=\"[0-9]*\" left=\"[0-9]*\" width=\"[0-9]*\" height=\"[0-9]*\" font=\"0\">"))

我已经在http://gskinner.com/RegExr/中测试了表达式,它检测到了这条线。

4

3 回答 3

3

matches方法检查整个字符串以匹配正则表达式。

采用

xml.matches(".*<text top=\"[0-9]*\" left=\"[0-9]*\" width=\"[0-9]*\" height=\"[0-9]*\" font=\"0\">.*")

否则您的模式将被评估为

^<text top=\"[0-9]*\" left=\"[0-9]*\" width=\"[0-9]*\" height=\"[0-9]*\" font=\"0\">$

这是永远找不到的。

旁注:我真的建议使用 xml 解析来做这些事情。

于 2013-09-18T11:37:43.500 回答
1

如果您想解析 XML,那么您应该使用 XML 解析器。这是一个使用 Java 内置的 DOM 和 XPath 支持的示例(省略了导入和异常处理):

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
DocumentBuilder builder = dbf.newDocumentBuilder();
// use parse(File) if you have the XML on disk rather than in a String
Document doc = builder.parse(new InputSource(new StringReader(xml)));

XPath xp = XPathFactory.newInstance().newXPath();
NodeList font0Texts = (NodeList)xp.evaluate("//text[@font = '0']", doc,
                                              XPathConstants.NODESET);

请注意,要使其正常工作xml,必须具有良好的格式,特别是它必须具有单个根级元素。您在问题中给出的示例是文档片段,而不是完整的文档,因为它具有多个根级元素。如果这是一个真正完整的示例,那么您将需要更多的东西来解析它:

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
DocumentBuilder builder = dbf.newDocumentBuilder();
Document doc = builder.newDocument();

DocumentFragment fragment = doc.createDocumentFragment();

LSInput input = ((DOMImplementationLS)doc.getImplementation()).createLSInput();
input.setStringData(xml);
LSParser parser = ((DOMImplementationLS)doc.getImplementation()).createLSParser(
     LSParser.MODE_SYNCHRONOUS, null);

parser.parseWithContext(input, fragment, LSParser.ACTION_REPLACE_CHILDREN);

然后,您可以使用fragment来评估 XPath 表达式:

XPath xp = XPathFactory.newInstance().newXPath();
NodeList font0Texts = (NodeList)xp.evaluate("//text[@font = '0']", fragment,
                                              XPathConstants.NODESET);
于 2013-09-18T12:25:33.820 回答
0

从你所说的我建议你使用正则表达式匹配器

 String regex = "^<text top=\"[0-9]*\" left=\"[0-9]*\" width=\"[0-9]*\" "+
      "height=\"[0-9]*\" font=\"0\">";
 Pattern patter = Pattern.compile(regex);
 Matcher matcher = pattern.matcher(xml);
 if (matcher.find()){
    ...
 }

这将导致您的 xml 以字体元素开头。

您可能还想使用如下正则表达式来捕获字体:

"^<text top=\"[0-9]*\" left=\"[0-9]*\" width=\"[0-9]*\" height=\"[0-9]*\" "+
       "font=\"0\">([^<]*)<"
于 2013-09-18T11:47:12.213 回答