我想在出现任何一个词'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
为了根据我指定的规则正确识别单词,我应该在这里考虑什么?
答案 0 :(得分:5)
您可以使用:
str = str.replaceAll("(?i)\\b(\\w*?[aeiou]\\w*)eed(?:ly)?", "$1ee");
在\\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))