2017-03-27 14 views
8

入力にこのグループを1回以上含めることができるパターンに一致するグループをキャプチャします。Regex:1つまたは複数のグループが存在する場合にキャプチャします(Java)

例:

input = 12361 randomstuff371 12 Mar 16 138more random381 stuff73f 

私は "3月12日16" キャプチャしたいです。このことから

は、私は簡単に正規表現を使用しています

pattern = (".*(\\d{2}\\s\\w+\\s\\d{2}).*"); 

私のトラブルは、入力がこれらのグループの複数を含むことができたとき、私は、その後の試合をキャプチャすることはできませんよということですが。

例:

よう
input = randomstuff371 12 Mar 16 14 Jan 15 13 Feb 16 138more random381 stuff73f 

:これらのグループの数が一致する

group 1 = 12 Mar 16 
group 2 = 14 Jan 15 
group 3 = 13 Feb 16 

は常に変化し、入力よりも動作する正規表現がある場合ので、私は思ったんだけどこれらのグループの1つ以上を含む。私は試した:

pattern = (".*(\\d{2}\\s\\w+\\s\\d{2}\\s)+.*"); \\ Not sure about whitespace at the end 

しかし、それは動作しません。これは、私がキャプチャされたこれらのグループをどのように保存しているかともっと関係していますか私は必要なグループの数をあらかじめ決めておくことはできません。特に、正規表現がこれらの入力の多くを処理する必要があるからです。

私はちょうど日付の全体のセグメントをキャプチャし、後でそれを処理してmatcher.find()で処理して、必要なグループの数を数えているように感じます。

ご協力いただければ幸いです。

+0

これは、表と裏の '。* 'のためです。それをしないでください。 –

+0

@Jamesさん、あなたのために働いた場合、回答を受け入れることを検討してください([回答を受け入れる方法](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work) )。 –

答えて

13

ちょうどあなたの特定のパターンに一致してMatcher#find()を使用して得られた複数の一致と部分文字列を取得するために容易になります。

String s = "randomstuff371 12 Mar 16 14 Jan 15 13 Feb 16 138more random381 stuff73f"; 
Pattern pattern = Pattern.compile("\\b\\d{2}\\s\\w+\\s\\d{2}\\b"); 
Matcher matcher = pattern.matcher(s); 
while (matcher.find()){ 
    System.out.println(matcher.group(0)); 
} 

online Java demoregex demoを参照してください。

パターンに単語境界を追加してパターンが単語全体と一致するようにしましたが、部分文字列が別のテキストに貼り付けられている場合は省略することができます。