2013-07-31 19 views
17

W poniższym kodzie:Java regex - nakładających mecze

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)); 
} 

wynik jest:

[2abc3, 4abc5] 

Chciałbym go mieć

[2abc3, 3abc4, 4abc5] 

Jak można to osiągnąć?

+0

Należy wyszukiwać rozpoczynając od każdego indeksu; użyj metody find (int startIndex) i rozpocznij wyszukiwanie od każdej pozycji znaku. Oczywiście, prawdopodobnie znajdziesz zbyt wiele dopasowań ... Zakładając, że chcesz zacząć od każdej liczby, możesz spróbować połączyć iterację za pomocą Matcher.find (String.indexOf (cyfry, indeks)) dla wszystkich pasujących indeksów. – user1676075

+0

Przypuszczam, że jeśli są to pojedyncze cyfry, możesz utworzyć kopię zapasową z pozycji początkowej meczu i znaleźć stamtąd na następny mecz. – user1676075

+1

Dla wejścia '" 12abc13abc14abc15 "', czy chcesz '[12abc13, 2abc13, 13abc14, 3abc14, 14abc15, 4abc15]' lub '[12abc13, 13abc14, 14abc15]'? – johnchen902

Odpowiedz

15

Zrób próbę dopasowujący, aby rozpocząć swój kolejny skan z tym ostatnim \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

Do pierwszych dwóch up voter: zwykła wersja zawiera błąd, który jeśli nic nie pasuje, zostanie zgłoszony wyjątek 'IllegalStateException'. – johnchen902

+0

+1 za dobrą improwizację. – anubhava

13

Nie wiem, czy jest to możliwe w Javie, ale w PCRE można wykonać następujące czynności:
(?=(\d+\D+\d+)).

Wyjaśnienie
Technika jest zastosowanie grupy pasujący w uprzedzona, a następnie " jeść "jedną postać, aby iść do przodu.

  • (?=: początek pozytywnego uprzedzona
    • (: start dopasowanie grupa 1
      • \d+: dopasować cyfrę jeden lub więcej razy
      • \D+: dopasować niż cyfra jeden lub więcej razy
      • \d+: dopasuj cyfrę jeden lub więcej razy
    • ): koniec z grupy 1
  • ): koniec uprzedzona
  • .: mecz niczego, to jest "do przodu".

Online demo


Dzięki Casimir et Hippolyte to naprawdę wydaje się działać w Javie. Trzeba tylko dodać ukośniki odwrotne i wyświetlić pierwszą grupę przechwytującą: (?=(\\d+\\D+\\d+)).. Testowane na www.regexplanet.com:

enter image description here

+1

Działa również w języku Java. –

+2

Daje błędne wyniki. – anubhava

+2

Nie działa w języku Java. – JDiPierro

1

Powyższe rozwiązanie HamZa działa doskonale w Javie. Jeśli chcesz znaleźć konkretny wzorzec w tekście wszystko co musisz zrobić, to:

String regex = "\d+\D+\d+"; 

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

Jeżeli regex jest wzór szukasz i być nakładających trzeba otoczyć ją (?=(" at the start and ")). na końcu.