2010-11-26 7 views
7

問題を簡単な英語で説明する方法がわかりませんので、私は正規表現の例を参考にしています。複数のオカレンスが一致する場合、各グループをキャプチャする方法はありますか?

((\\d+) - (\\d+)\n)+ 

このパターンは、一度にこれらの行に一致します:私はこれに類似したもの(例はほとんど簡略化されている)を持っている

123 - 23 
32 - 321 
3 - 0 
99 - 55 

パターンは3つのグループが含まれています:最初の1行を一致して、 2行目は行の最初の番号と一致し、3行目は行の2番目の番号と一致します。

これらの番号をすべて取得する可能性はありますか? Matcherには3つのグループしかありません。最初のものは99 - 55、2番目のものは99、3番目のものは55です。

SSCCE:

class Test { 
    private static final Pattern pattern = Pattern.compile("((\\d+) - (\\d+)\n)+"); 

    public static void parseInput(String input) { 

     Matcher matcher = pattern.matcher(input); 

     if (matcher.matches()) { 

      for (int i = 0; i <= matcher.groupCount(); i++) { 
       System.out.println("------------"); 
       System.out.println("Group " + i + ": " + matcher.group(i)); 
      } 
      System.out.println(); 
     } 

    } 

    public static void main(String[] args) { 
     parseInput("123 - 23\n32 - 321\n3 - 0\n99 - 55\n"); 
    } 
} 

答えて

5

もし私が ない (個別の可能性) 誤解だが、その後、あなたが matcher.matches()を呼び出すたびに、それは次の試合に更新します。 したがって、基本的にif (matcher.matches())while (matcher.find())に変更すると、すぐに使用できます。

EDIT:実際に、それはそれがこれを行うことfindだ、matchesではありません。

http://download.oracle.com/javase/7/docs/api/java/util/regex/Matcher.html#find%28%29

ここではそれを使用しての例です:

http://download.oracle.com/javase/tutorial/essential/regex/test_harness.html

+0

マッチャーですか?matches()またはmatcher.find()を呼び出すたびにそれをやり直しますか? (またはその両方) –

+0

私は昨日「試合」について質問し、それを読んでいるので、かなり確信しています。残念なことに、「見つける」、私は知らない。 –

+0

私はそれを動作させることはできません。この作業に成功したコードはありますか? – Roman

2

あなたがそれぞれ一致するようにしようとしています別に行がありますか?

一行のみと変更と一致するように+を削除:に

if (matcher.matches()) { 

を:

while (matcher.matches()) { 

、それはループが一回、各試合のために、自動的に試合の間の任意の不一致のテキストをスキップします。

matcher.group(0)はマッチ全体を返します。実際のグループは1から始まります。

7

マイク・カロンの答えについてもう1つコメントしてください。単純に「if」を「while」に置き換え、「match」ではなく「find」を使用すると、プログラムは機能しません。また、正規表現を変更する必要があります。「+」を含む最後のグループは、このパターンの複数回の出現を検索するため、削除する必要があります。明確にするために

、これは動作します最終的なプログラムです:

class Test { 
    private static final Pattern pattern = Pattern.compile("(\\d+) - (\\d+)\n"); 

    public static void parseInput(String input) { 

     Matcher matcher = pattern.matcher(input); 

     while (matcher.find()) { 

      for (int i = 0; i <= matcher.groupCount(); i++) { 
       System.out.println("------------"); 
       System.out.println("Group " + i + ": " + matcher.group(i)); 
      } 
      System.out.println(); 
     } 
    } 

    public static void main(String[] args) { 
     parseInput("123 - 23\n32 - 321\n3 - 0\n99 - 55\n"); 
    } 
} 

それは最初のグループは全体のラインであり、2つの次のグループごとに番号が含まれている各ラインのために次の3つのグループを提供します。これはわかりやすいチュートリアルです。http://tutorials.jenkov.com/java-regex/matcher.html

関連する問題