2016-02-16 15 views
5

Próbuję zastąpić 'eed' and 'eedly' with 'ee' ze słów, w których występuje samogłoska, zanim pojawi się termin ('eed' or 'eedly').Wyrażenie wyrażenie do usunięcia eonu ze stringa

Na przykład słowo stanie się indee, ponieważ istnieje samogłoska ("i"), która ma miejsce przed "eedem". Z drugiej strony słowo 'feed' nie zmieni się, ponieważ przed sufiksem 'eed' nie ma samogłoski.

Mam to wyrażenie: (?i)([aeiou]([aeiou])*[e{2}][d]|[dly]\\b) Możesz zobaczyć, co się dzieje z tym here.

Jak widać, jest to poprawna identyfikacja słów kończących się na 'eed', ale nieprawidłowo identyfikuje 'eedly'.

Również, kiedy to robi zastąpić, jest zastąpienie wszystkich słów, które kończą się 'eed', nawet takich słów jak feed których nie powinno się usuwać eed

Co powinienem być tutaj rozważa w celu uczynienia go prawidłowo zidentyfikować słowa oparte na regułach, które określiłem?

Odpowiedz

5

Można użyć:

str = str.replaceAll("(?i)\\b(\\w*?[aeiou]\\w*)eed(?:ly)?", "$1ee"); 

Updated RegEx Demo

\\b(\\w*?[aeiou]\\w*) przed eed lub eedly pilnuje istnieje co najmniej jedna samogłoska w tym samym słowie przed tym.

Aby przyspieszyć ten regex można użyć zanegowane regex wyrażenie:

\\b([^\\Waeiou]*[aeiou]\\w*)eed(?:ly)? 

RegEx Rozpad:

\\b     # word boundary 
(     # start captured group #` 
    [^\\Waeiou]*  # match 0 or more of non-vowel and non-word characters 
    [aeiou]   # match one vowel 
    \\w*    # followed by 0 or more word characters 
)     # end captured group #` 
eed     # followed by literal "eed" 
(?:     # start non-capturing group 
    ly    # match literal "ly" 
)?     # end non-capturing group, ? makes it optional 

Wymiana jest:

"$1ee" which means back reference to captured group #1 followed by "ee" 
+1

Działa to idealnie. Dziękuję Ci. Czy mógłbyś wyjaśnić logikę stojącą za tym bardziej? Jestem stosunkowo nowy, aby wyrecytować, więc chciałbym się naprawdę dowiedzieć, dlaczego to działa. @anubhava – Anderology

+0

ok sprawdź zaktualizowaną odpowiedź z wyjaśnieniem. – anubhava

+1

Tak, dziękuję bardzo! – Anderology

1

znaleźć DLY przed f inding d. w przeciwnym razie ocena regex zakończy się po znalezieniu eed.

(?i)([aeiou]([aeiou])*[e{2}](dly|d))