2012-01-19 9 views
9

mam następny kod:dla chciwy Wyrażenie regularne w Javie

public static void createTokens(){ 
    String test = "test is a word word word word big small"; 
    Matcher mtch = Pattern.compile("test is a (\\s*.+?\\s*) word (\\s*.+?\\s*)").matcher(test); 
    while (mtch.find()){ 
     for (int i = 1; i <= mtch.groupCount(); i++){ 
      System.out.println(mtch.group(i)); 
     } 
    } 
} 

I mieć następną wyjście:

word 
w 

Ale moim zdaniem to musi być:

word 
word 

Somebody proszę wyjaśnij mi, dlaczego tak jest?

Odpowiedz

10

Ponieważ Twoje wzorce nie są chciwe, więc dopasowywały się tak mało tekstu, jak to możliwe, a jednocześnie składały się z dopasowania.

Usunąć? w drugiej grupie, a dostaniesz
słowo słowo słowo
duży mały

Matcher mtch = Pattern.compile("test is a (\\s*.+?\\s*) word (\\s*.+\\s*)").matcher(test); 
+0

A teraz druga grupa przechwytuje za dużo, zamiast za mało. Brak łakomstwa nie stanowi problemu, a chciwość nie jest rozwiązaniem. –

+1

Masz rację, ale IMHO, nie-zachłanność drugiej grupy przechwytującej, wyjaśnia, dlaczego przechwytuje ona po prostu "w". Pierwsza grupa przechwytująca musi uchwycić "słowo" z powodu następującego po nim "słowa". Nie wiem dokładnie, czego szuka, a on zredagował pytanie po tym, jak przesłałem swoją odpowiedź, więc nie mogę podać prawidłowego wyrażenia regularnego. – theglauber

3

Korzystając \\s* będzie dopasować dowolną liczbę miejsc w tym 0 przestrzeniach. w mecze (\\s*.+?\\s*). Aby upewnić się, że pasuje do słowa oddzielonego spacjami spróbuj (\\s+.+?\\s+)

+0

Problem w tym, że wyrażenie regularne już zużywa spacje przed i po słowie, więc teraz próbujesz je pochłonąć dwa razy. –

+0

Wszystko, co musisz zrobić, to usunąć spację z wyrażeń regularnych takich jak ... '\\ s +) słowo (\\ s +' ... –