正则表达式从字符串中删除eed

时间:2016-02-16 19:36:26

标签: java regex

我想在出现任何一个词'eed' and 'eedly' with 'ee'之前,从有元音的词中替换('eed' or 'eedly')

因此,例如,单词indeed将成为indee,因为有一个元音(' i')发生在“#”之前。另一方面,单词'feed'不会改变,因为在后缀'eed'之前没有元音。

我有这个正则表达式:(?i)([aeiou]([aeiou])*[e{2}][d]|[dly]\\b) 你可以看到这个here发生了什么。

正如您所看到的,这是正确识别以'eed'结尾的字词,但它无法正确识别'eedly'

此外,当它执行替换时,它会替换所有以'eed'结尾的单词,甚至是feed之类的单词,它不应删除eed

为了根据我指定的规则正确识别单词,我应该在这里考虑什么?

2 个答案:

答案 0 :(得分:5)

您可以使用:

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

Updated RegEx Demo

\\b(\\w*?[aeiou]\\w*)eed之前

eedly确保此前在同一个字词中至少有一个元音。

加速这个正则表达式,你可以使用否定表达式正则表达式:

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

RegEx分手:

\\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 :(得分:1)

在找到d之前找到dly。否则你的正则表达式评估在找到eed后停止。

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