たとえば、次の正規表現があります:\d{2}
(2桁)。そして、私が使用するとき
Matcher matcher = Pattern.compile("\\d{2}").matcher("123");
matcher.find();
String result = matcher.group();
結果変数では、最初のエントリ、つまり。のみを取得します12
。12
しかし、私はすべての可能なエントリ、すなわちとを取得したいと思います23
。
これを達成する方法は?
あなたは前向きな先読みの中で捕獲グループの助けを必要とするでしょう:
Matcher m = Pattern.compile("(?=(\\d{2}))").matcher("1234");
while (m.find()) System.out.println(m.group(1));
プリント
12
23
34
これは、正規表現のマッチングが機能する方法ではありません。マッチャーは文字列の先頭から開始し、一致が見つかるたびに、その一致の終了後に文字から検索を続けます。重複する一致は表示されません。
先読みを使用したりグループをキャプチャしたりせずに、任意の正規表現の重複する一致を見つけたい場合は、一致するたびにマッチャーの「領域」をリセットすることでこれを行うことができます。
Matcher matcher = Pattern.compile(theRegex).matcher(str);
// prevent ^ and $ from matching the beginning/end of the region when this is
// smaller than the whole string
matcher.useAnchoringBounds(false);
// allow lookaheads/behinds to look outside the current region
matcher.useTransparentBounds(true);
while(matcher.find()) {
System.out.println(matcher.group());
if(matcher.start() < str.length()) {
// start looking again from the character after the _start_ of the previous
// match, instead of the character following the _end_ of the match
matcher.region(matcher.start() + 1, str.length());
}
}