为了缩短一些名称,但仍然保持它们的可读性,我想从字符串中删除所有元音,除了第一次和最后一次出现。例如,我希望“Minnesota”变成“Minnsta”。
my $name="Minnesota";
我尝试使用 Perl 的零宽度后视正则表达式语法,如下所示:
$name =~ s/(?<=[aeiou])([^aeiou]*)[aeiou]/$1/ig; # minnst
然而,虽然这会正确处理第一个元音,但它会删除最后一个元音。为了解决这个问题,我尝试保留最后一个元音,如下所示:
$name =~ s/(?<=[aeiou])([^aeiou]*)([aeiou])([aeiou][^aeiou]*)$/$1$3/ig; # minnesota
这也不起作用,大概是因为 '$' 将整个正则表达式锚定到字符串的末尾。
当然,我可以查找第一个元音的位置,反转字符串的其余部分并删除除“第一个”(最后一个)之外的所有元音,然后重新反转并连接字符串,但这不是很优雅。我觉得我忽略了零宽度语法的一个选项。