2017-03-27 19 views
8

Chcę przechwytywać grupy pasujące do wzorca, w którym dane wejście może zawierać tę grupę raz lub więcej razy.Regex: Przechwytuje jedną lub więcej grup, jeśli istnieje (Java)

Przykład:

input = 12361 randomstuff371 12 Mar 16 138more random381 stuff73f 

Chcę uchwycić "12 mar 16".

Od tego mam łatwo wykorzystane regex:

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

Jednak moim problemem jest to, że gdy wejście może zawierać więcej niż jeden z tych grup, nie jestem w stanie uchwycić kolejne mecze.

Przykład:

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

taka, że:

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

Liczba tych grup, aby dopasować zawsze będzie się zmieniać, a więc zastanawiam się, czy jest regex, który będzie pracować nad wejściami które zawierają 1 lub więcej z tych grup. Próbowałem:

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

Jednak to nie działa. Czy jest to bardziej związane z przechowywaniem tych przechwyconych grup? Nie mogę z góry określić liczby grup, które będę potrzebować, zwłaszcza, że ​​regex musi pracować nad wieloma z tych danych wejściowych.

Czuję się tak, jakbym był lepszy od przechwytywania całego segmentu dat i radzenia sobie z nim później z matcher.find(), aby policzyć liczbę grup, które wymagam.

Każda pomoc będzie doceniana.

+0

Wynika to z ". *" Z przodu iz tyłu. Nie rób tego. –

+0

@ James, rozważ zaakceptowanie odpowiedzi, jeśli zadziałało dla Ciebie (patrz [Jak akceptować odpowiedzi SO] (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)). –

Odpowiedz

13

To będzie łatwiej po prostu pasuje do określonego wzorca twój i uzyskać podciągi jak wielu meczów uzyskanych przy użyciu 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)); 
} 

Zobacz online Java demo i regex demo.

Dodałem granice słów do wzoru, aby upewnić się, że wzór jest dopasowany jako całe słowo, ale mogą one zostać pominięte, jeśli podciągi zostaną sklejone z innym tekstem.