正则表达式适用于在线检查程序,但不适用于java

时间:2013-09-18 11:36:34

标签: java regex

我有一个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/中测试了表达式并检测到了该行。

3 个答案:

答案 0 :(得分: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解析来完成这些工作。

答案 1 :(得分: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);

答案 2 :(得分:0)

根据您的陈述,我建议您使用regex Matcher

 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以font元素开头。

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

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