2016-02-16 20 views
5

Sto tentando di sostituire 'eed' and 'eedly' with 'ee' da parole in cui è presente una vocale prima che compaia il termine ('eed' or 'eedly').espressione regex per rimuovere eed dalla stringa

Quindi, ad esempio, la parola indeed diventerebbe indee perché c'è una vocale ('i') che si verifica prima del 'e'. D'altra parte la parola 'feed' non cambierebbe perché non c'è vocale prima del suffisso 'eed'.

Ho questa espressione regolare: (?i)([aeiou]([aeiou])*[e{2}][d]|[dly]\\b) È possibile vedere cosa sta succedendo con questo here.

Come si può vedere, questo identifica correttamente le parole che terminano con 'eed', ma non identifica correttamente 'eedly'.

Inoltre, quando si fa la sostituzione, sostituisce tutte le parole che terminano con 'eed', anche parole come feed che non dovrebbe rimuovere il eed

Cosa devo essere considerato qui per rendere correttamente identificare le parole basate sulle regole che ho specificato?

risposta

5

È possibile utilizzare:

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

Updated RegEx Demo

\\b(\\w*?[aeiou]\\w*) prima eed o eedly fa che ci sia almeno una vocale nella stessa parola prima di questo.

Per accelerare questo regex è possibile utilizzare negato espressione regex:

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

RegEx Breakup:

\\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 

La sostituzione è:

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

Questo funziona perfettamente. Grazie. Ti dispiacerebbe spiegare la logica dietro questo un po 'di più? Sono relativamente nuovo di regex, quindi mi piacerebbe davvero imparare perché questo funziona. @anubhava – Anderology

+0

ok controlla risposta aggiornata con spiegazione. – anubhava

+1

Sì, grazie mille! – Anderology

1

trovare dly prima f inding d. altrimenti la valutazione regex si interrompe dopo aver trovato eed.

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