2016-02-16 19 views
5

いずれかの用語の前に母音がある単語から'eed' and 'eedly' with 'ee'を置き換えようとしています。('eed' or 'eedly')が表示されます。正規表現を使用して文字列からeeを削除する

たとえば、単語「indeed」は、「eed」の前に母音があるため、indeeになります。一方、接尾辞'eed'の前に母音がないので、単語'feed'は変更されません。

私はこの正規表現を持っています:(?i)([aeiou]([aeiou])*[e{2}][d]|[dly]\\b) これはhereで何が起こっているか見ることができます。

ご覧のとおり、これは'eed'で終わる単語を正しく識別していますが、'eedly'を正しく識別していません。それは、それは私がそれを正しく識別させるために、ここで考慮されなければならない何'eed'で終わるすべての単語、それはeed

を削除するべきではありませんfeedのようにも言葉を置き換えて代わるん。また

、私が指定したルールに基づく言葉?

答えて

5

あなたは使用することができます。

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

Updated RegEx Demo

eed\\b(\\w*?[aeiou]\\w*)またはeedlyこの前と同じ言葉に少なくとも1つの母音があることを確認しますが。分裂

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

正規表現:

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

交換は、次のとおりです。

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

これは完全に機能します。ありがとうございました。この背後にある論理を少し説明してもらえますか?私は正規表現に比較的新しいので、なぜこれが動作しているのかを本当に知りたいと思います。 @anubhava – Anderology

+0

ok更新された解答を解説付きでチェックします。 – anubhava

+1

ありがとうございました! – Anderology

1

をfの前にDLY見つける

にあなたが否定表現regexを使用することができますこの正規表現を促進インリングd。さもなければ正規表現評価はeedを見つけた後に終了します。

(?i)([aeiou]([aeiou])*[e{2}](dly|d)) 
関連する問題