2013-07-31 10 views
17

Javaの正規表現次のコードでは、重複試合

public static void main(String[] args) { 
    List<String> allMatches = new ArrayList<String>(); 
    Matcher m = Pattern.compile("\\d+\\D+\\d+").matcher("2abc3abc4abc5"); 
    while (m.find()) { 
     allMatches.add(m.group()); 
    } 

    String[] res = allMatches.toArray(new String[0]); 
    System.out.println(Arrays.toString(res)); 
} 

結果は次のとおりです。

[2abc3, 4abc5] 

私はそれが

[2abc3, 3abc4, 4abc5] 

どのようにできるようにしたいと思いますそれは達成される? 「
(?=(\d+\D+\d+)).

説明、その後
技術は、先読みに一致するグループを使用することです 、そして:これはJavaで可能ですが、PCREで、あなたが次の操作を行うことができれば

+0

すべてのインデックスから検索を開始する必要があります。 find(int startingIndex)メソッドを使用し、すべての文字位置から検索を開始します。 Matcher.find(String.indexOf(digits、index))の繰り返しを、すべての一致するインデックスについて組み合わせることを試みるかもしれません。 – user1676075

+0

1桁の数字であれば、試合開始位置からバックアップして、そこから次の試合を見つけることができます。 – user1676075

+1

入力「12abc13abc14abc15」に対して、「[12abc13,2abc13,13abc14,3abc14,14abc15,4abc15]」または「[12abc13,13abc14,14abc15]」を入力しますか? – johnchen902

答えて

15

は後者\d+からその次のスキャンを開始するマッチャーの試みを行います。

Matcher m = Pattern.compile("\\d+\\D+(\\d+)").matcher("2abc3abc4abc5"); 
if (m.find()) { 
    do { 
     allMatches.add(m.group()); 
    } while (m.find(m.start(1))); 
} 
+0

最初の2人のアップ投票者に:普通のバージョンには、何もマッチしなければ、IllegalStateExceptionがスローされるバグがあります。 – johnchen902

+0

+1素晴らしい即興。 – anubhava

13

わかりません一人のキャラクターを「食べる」ことができます。

  • (?=:肯定先読み開始
    • (:グループ1
      • \d+に一致開始:
      • \D+一回以上
      • 桁と一致:非数字文字と一致一つ又は複数回
      • \d+:1桁または複数の数字に一致する
    • ):先読み
    • .の終わり:グループ1
  • )の終わりは何も一致し、これは "前進" することです。本当にJavaで動作しているようですCasimir et Hippolyteから

Online demo


感謝。バックスラッシュを追加し、最初のキャプチャグループを表示するだけです:(?=(\\d+\\D+\\d+)).www.regexplanet.comでテスト :

enter image description here

+1

これはjavaでも動作します。 –

+2

これは間違った結果をもたらします。 – anubhava

+2

javaでは動作しません。 – JDiPierro

1

上記のHamZaのソリューションは、Javaで完全に機能します。あなたは、テキスト内の特定のパターンを検索したい場合は、あなたがしなければならないすべては、次のとおりです。

regexは、あなたが探しているとあなたが最後に (?=(" at the start and ")).で囲む必要があり、重複させるパターンです
String regex = "\d+\D+\d+"; 

String updatedRegex = "(?=(" + regex + ")).";