4

たとえば、次の正規表現があります:\d{2}(2桁)。そして、私が使用するとき

  Matcher matcher = Pattern.compile("\\d{2}").matcher("123");
  matcher.find();
  String result = matcher.group();

結果変数では、最初のエントリ、つまり。のみを取得します1212しかし、私はすべての可能なエントリ、すなわちとを取得したいと思います23

これを達成する方法は?

4

3 に答える 3

6

あなたは前向きな先読みの中で捕獲グループの助けを必要とするでしょう:

Matcher m = Pattern.compile("(?=(\\d{2}))").matcher("1234");
while (m.find()) System.out.println(m.group(1));

プリント

12
23
34
于 2013-01-15T10:21:00.360 に答える
1

これは、正規表現のマッチングが機能する方法ではありません。マッチャーは文字列の先頭から開始し、一致が見つかるたびに、その一致の終了後に文字から検索を続けます。重複する一致は表示されません。

先読みを使用したりグループをキャプチャしたりせずに、任意の正規表現の重複する一致を見つけたい場合は、一致するたびにマッチャーの「領域」をリセットすることでこれを行うことができます。

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());
  }
}
于 2013-01-15T10:29:22.817 に答える
0

このようなもの

^(?=[1-3]{2}$)(?!.*(.).*\1).*$

ここでテストと実験

于 2013-01-15T10:23:26.413 に答える