2009-06-07 17 views
1

[編集 - 本当に申し訳ありませんが、私が引用したコードは間違っていました - これを反映するために以下のメッセージを変更しました。お詫び!あなたのご辛抱ありがとうございます。]Java - 一重引用符を含む正規表現パターンとの一致方法?

私は正規表現には新しく、Javaのパターンにマッチしたいと考えています(この解決策の後に - Java string - get everything between (but not including) two regular expressions?)。そう、

<row><column name='_id'>1</column></row><row><column name='text'>Header\n\n\ntext</column></row><row><column name='pwd'>password</column></row> 

そして私はタグ列名= 'text' の間だものだけを返すようにしたい:

文字列は、[EDITED]さ

Header\n\n\ntext 

私が持っています[EDITED]の下のコードですが、一致しません。どのように私はパターンを変更する必要があります上の任意のアイデア?

ありがとうございます!

package test; 

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class Regex { 

    public static void main(String[] args) { 
     Pattern p = Pattern.compile(
       "<row><column name='text'>(.*)</column></row>", 
       Pattern.DOTALL 
      ); 
     Matcher matcher = p.matcher(
       "<row><column name='_id'>1</column></row><row><column name='text'>Header\n\n\ntext</column></row><row><column name='pwd'>password</column></row>" 
      ); 
     if(matcher.matches()){ 
       System.out.println(matcher.group(1)); 
     } 
    } 
} 

答えて

4

あなたが投稿した(編集されていない)コードは私のためにうまくいきます...あなたが期待しているメッセージと一致し、それを印刷します。このように見えるように

編集コードは、動作しません。しかし、あなたは非常にわずかに正規表現を変更した場合:

Header 


text</column></row><row><column name='pwd'>password 

おそらく何実際にはありません。

Pattern p = Pattern.compile(
      ".*<row><column name='text'>(.*)</column></row>.*", 
      Pattern.DOTALL 
     ); 

あなたは試合を取得しますしかし、あなたはさらに正規表現を洗練する必要があります。正規表現を使ってxml/html解析を処理することは、一般的には良いアプローチではありません。 Yishaiの提案はXMLパーサーを使用する方が良い方法です。そうでなければ、おそらく非常に複雑で柔軟性のない正規表現に終わるでしょう。あなたの本当の例では、名前=値の何かを持っている可能性があるため(少なくとも、はるかに現実世界のように見えるであろうと)

public static void main(String[] args) { 
    Pattern p = Pattern.compile(
      "<row><column name='(.*?)'>(.*?)</column></row>", 
      Pattern.DOTALL 
     ); 

    Matcher matcher = p.matcher(
      "<row><column name='text'>Header\n\n\ntext</column></row>" 
     ); 

    if(matcher.matches()){ 
      System.out.println(matcher.group(2)); 
    } 
} 

を:

+0

ありがとうございました!アドバイスをいただきありがとうございます - 私はXMLパーサーを使用して見ていきます。 –

1

(.*?)だけではなく(.*)をマッチングしてみます。

(.*)は、それ以降のすべてに一致する貪欲な検索です。

(.*?)は、最初に "</column></row>"に停止します。

編集:これは本当にあなたの例に影響を与えるべきではないが、あなたは、文字列内の別の「</column></row>」を持っている場合、あなたが期待するよう、あなたのパターンが一致しません。

3

はおそらく、あなたは本当にこれであるために取得したいのか。

これは言うまでもなく、これがはるかに重要でない場合は、SAXパーサー(これはJDK 1.5+に組み込まれているため、必ずしもライブラリの依存関係の問題ではありません) 。 Regexは、文書の構造を気にせず、単純に何かを吸いたいだけなら、XMLを解析する良い方法です。しかし、属性を取得してXML上にあるものを気にかけ始めるならば、正規表現のルートを続けることは、ホイールを再開発することになります。

0

あなたの問題は引用文字とは関係ありません。あなただけ(他の人が提案してきたように)非貪欲数量詞に切り替えて、代わりにmatches()find()メソッドを使用する必要があります。

public static void main(String[] args) 
{ 
    Pattern p = Pattern.compile(
     "<row><column name='text'>(.*?)</column></row>", 
     Pattern.DOTALL 
); 

    Matcher matcher = p.matcher(
     "<row><column name='_id'>1</column></row>" + 
     "<row><column name='text'>Header\n\n\ntext</column></row>" + 
     "<row><column name='pwd'>password</column></row>" 
); 

    if(matcher.find()) { 
     System.out.println(matcher.group(1)); 
    } 
} 

matches()戻り正規表現はにターゲット文字列の最初から一致する場合にのみtrue終わり。文字列全体よりも小さいものと一致させる場合は、find()を使用する必要があります。

関連する問題