当前位置: 首页 > 知识库问答 >
问题:

Perl单词去元音化:去除除了第一个和最后一个元音以外的所有元音

祖浩淼
2023-03-14

为了缩短一些名字,但仍然保持它们的可读性,我想删除字符串中的所有元音,除了第一个和最后一个。例如,我希望“明尼苏达”变成“明斯塔”。

my $name="Minnesota";

我已经尝试使用Perl的零宽度查找正则表达式语法,如下所示:

$name =~ s/(?<=[aeiou])([^aeiou]*)[aeiou]/$1/ig; # minnst

然而,尽管这适当地处理了第一个元音,但它删除了最后一个元音。为了解决这个问题,我试着保留最后一个元音,如下所示:

$name =~ s/(?<=[aeiou])([^aeiou]*)([aeiou])([aeiou][^aeiou]*)$/$1$3/ig; # minnesota

这也不起作用,大概是因为“$”将整个正则表达式锚定在字符串的末尾。

当然,我可以查找第一个元音的位置,反转字符串的其余部分并删除除“第一个”(最后一个)之外的所有元音,然后重新反转并连接字符串,但这不是很优雅。我觉得我忽略了零宽度语法的选项之一。

共有3个答案

牛昱
2023-03-14

确保匹配后有一个元音,但将其从匹配中排除。

$name =~ s/(?<=[aeiou])([^aeiou]*)[aeiou](?=.*[aeiou])/$1/ig;

您的regexp完成的替换是:

    < li >明尼苏达州=

因此,最后一个替换将“nnsta”与“nnst”交换。

my $name="Minnesota";
my $prev = '';
while ( $name ne $prev ) {
    $prev = $name;
    $name =~ s/(?<=[aeiou])([^aeiou]*)[aeiou]/$1/i;
    print "$prev => ${^MATCH} -> $1 => $name\n";
}
林富
2023-03-14

对我来说,这个有效(前面的“1”是故意的):

1 while ($name =~ s/^(.+)[AEIOUaeiou]/$1/g );

如果您想保留$name的最小长度(例如3):

1 while (length $name > 3 && $name =~ s/^(.+)[AEIOUaeiou]/$1/g );

当然,您可以使用“I”标志来忽略大小写,而不是写“AEIOUaeiou”。为了便于阅读,我明确地写了下来。

当然,您可以在括号中插入任何字符。

孙德宇
2023-03-14

只需为正则表达式指定一个结束边界条件:< code >(?![^aeiou]*$):

use strict;
use warnings;

my @words = qw(Minnesota concatenate strings elegant I feel overlooking options syntax any greatly appreciated);

for (@words) {
    my $word = $_;

    $word =~ s/(?<=[aeiou])([^aeiou]*)[aeiou](?![^aeiou]*$)/$1/ig;

    printf "%-12s -> %s\n", $_, $word;
}

产出:

Minnesota    -> Minnsta
concatenate  -> conctnte
strings      -> strings
elegant      -> elgant
I            -> I
feel         -> feel
overlooking  -> ovrlking
options      -> optons
syntax       -> syntax
any          -> any
greatly      -> greatly
appreciated  -> apprcted
 类似资料:
  • 我需要找到一个单词中元音的计数。然而,当我比较单词中的字母是否是元音时, 举个例子,我做的就像下面这个, ……)//其余部分被省略 语句变得太长。有没有办法将它们与正则表达式或类似正则表达式的比较进行比较,并给我字符串中元音出现的次数?

  • 我试图返回所有元素,除了中的最后一个元素,如果tuple中只有两个元素,则返回第一个。由于有很多编译时工具,所以应该可以使用双返回类型。以下是我目前掌握的情况: 如果我能以c 17友好的方式来做这件事,那就太好了。我在上述实现中遇到以下错误: /元组。cpp:36:55:错误:包扩展不包含任何未扩展的参数包 返回std::tuple_cat(std::make_tuple(std::get)。。。

  • 问题内容: 如何使用CSS3选择器选择除最后一个子项之外的所有子项? 例如,只得到最后一个孩子第N个子项(1) 是的。。 问题答案: 您可以使用否定伪类:not()对:last-child伪类。正在被引入CSS选择器3级,它不适用于IE8或更低版本:

  • 如何移除第一个数组但返回减去第一个元素的数组 在我的示例中,当删除第一个元素时,我应该得到

  • 给定一个整数< code>n,程序必须删除包含< code>n个元音的每个单词。该字符串是从test.txt文件中读取的,该文件包含以下内容:< code>Astazi nu este maine。目前我的程序包含一个< code>count1函数,它计算字符串中每个单词的字符数和元音数。当输入< code>n元音字母以删除所需单词并打印更新后的字符串时,如何使用< code>count1函数中的

  • 本文向大家介绍php中删除数组的第一个元素和最后一个元素的函数,包括了php中删除数组的第一个元素和最后一个元素的函数的使用技巧和注意事项,需要的朋友参考一下 对于一个php数组,该如何删除该数组的第一个元素或者最后一个元素呢?其实这两个过程都可以通过php自带的函数 array_pop 和 array_shift 来完成,下面就具体介绍一下如何来操作。 (1)使用 array_pop 删除数组的