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 が font 要素で始まる場合に true になります。

次のように正規表現を使用してフォントをキャプチャすることもできます。

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