我有一个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/中测试了表达式并检测到了该行。
答案 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\">([^<]*)<"