2013-07-29 22 views
5

problem:Java: Wyrażenie regularne, gdzie każda postać występuje 0-1 razy

  1. meczów słowa, w którym każdy znak wyrażenia regularnego występuje raz na najbardziej.

  2. Słowo musi być określonej wielkości, powiedzmy, "{2,5}"

  3. jeden konkretny znak musi być w słowie, powiedzmy char "e"

Co mam:

word.matches("^[abcde]{2,5}$"); 

ten pasuje do wszystkich słów, znaków, gdzie a, b, c, d, e oraz występujące 0..5 razy. Dlatego słowa "abba" i "martwy" są dopasowane, mimo że "abba" używa znaku "b" dwa razy i "martwy" używa znaku "d" dwa razy. Wyrażenie ignoruje również, czy znak "e" znajduje się w słowie.

To, czego chcę, to dopasowanie, w którym każdy znak jest używany maksymalnie, słowo ma długość 2-5 liter, a znak "e" jest w słowie. Prawidłowe dopasowanie byłoby na przykład "paciorkami", ponieważ każdy znak jest użyty raz max, a znak "e" jest w słowie.

+1

To byłoby skomplikowane wyrażenie regularne. Sugerowałbym nie używać w tym celu wyrażenia regularnego. Regex nie jest w stanie "dopasować tego raz nigdzie w ciągu znaków". –

Odpowiedz

11

Można używać wyrażeń takich jak:

^(?=[abcd]*e)(?:([abcde])(?![abcde]*?\1)){2,5}$ 

kilka uwag:

^ 
(?=[abcd]*e)  # make sure there is an "e" 
(?: 
    ([abcde])  # match a character and capture it 
    (?!   # make sure it's not repeated 
    [abcde]*? 
    \1   # reference to the previously matched char 
) 
){2,5} 
$ 
+0

Wydaje się, że do pracy, myślałem, że będzie to o wiele bardziej skomplikowane. Ładna odpowiedź +1. –

+1

+1 Ładne wyrażenie regularne. :) –

+1

@RohitJain, '# comments' są poprawnymi komentarzami w ciągach regex podczas używania' (? X) 'lub równoważnej flagi. Więc proszę zostaw to. Dokumenty (http://docs.oracle.com/javase/1.4.2/docs/api/java/util/regex/Pattern.html#COMMENTS). – Qtax