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

5
我尝试将单词中任一出现 'eed' 或 'eedly' 且在这些术语之前有元音字母的部分替换为 'ee'。例如,单词 'indeed' 将变为 'indee',因为 'eed' 前面有元音字母 'i'。另一方面,单词 'feed' 不会发生变化,因为后缀 'eed' 前面没有元音字母。
我有这个正则表达式:(?i)([aeiou]([aeiou])*[e{2}][d]|[dly]\\b)。你可以在 这里 看到它的作用。
正如你所看到的,它正确地识别了以 'eed' 结尾的单词,但无法正确识别 'eedly'。
此外,在进行替换时,它替换了所有以 'eed' 结尾的单词,甚至像 'feed' 这样不应删除 'eed' 的单词也被替换了。
我应该考虑什么才能根据我指定的规则正确识别单词?
2个回答

5

您可以使用:

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

正则表达式演示已更新

\\b(\\w*?[aeiou]\\w*)eedeedly 之前,确保同一单词中至少有一个元音字母。

为了加速此正则表达式,您可以使用否定表达式正则表达式:

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

1
在找到d之前先找到dly。否则,您的正则表达式评估将在找到eed后停止。
(?i)([aeiou]([aeiou])*[e{2}](dly|d))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接