与Perl模式匹配

时间:2013-03-12 03:55:19

标签: regex perl

我的输入文件中有一个字典单词列表,我正在尝试对一个单词进行模式匹配,该单词具有按顺序出现在单词中的所有元音(a,e,i,o,u) 。他们不必彼此紧挨着。现在,这是我的代码:

open(INFILE, "words.txt") or die "Can't open word.txt: $!";
while(<INFILE>){
    $word = <INFILE>;
    if($word =~ /[a-z][a-zA-Z]*a[a-zA-Z]*e[a-zA-Z]*i[a-zA-Z]*o[a-zA-Z]*u[a-zA-Z]*/){
        print $word;
    }
}
close(INFILE);

但即使我知道我的输入中有一个单词,我也没有回复。我可以解释一下原因吗?这是作业。

编辑:第一个字母必须是小写,所有元音必须是小写。此外,在搜索aeiou模式时,我不能重复。

EDIT2:匹配的字词示例为abstemiousnessaAbstemiousnessbadetikojuw.不匹配的示例为ambeeiou(在找到之前重复e完整模式的aeiou),0abstemiousness(非字母0),Taeiou(以大写字母开头),baEstmious(未找到小写e)。

3 个答案:

答案 0 :(得分:3)

怎么样

a.*e.*i.*o.*u

.*匹配中间的零个或多个字符,因此以这种方式编写它可确保元音顺序排列。这也假设每行只有一个单词,这似乎就是这种情况。

编辑:

替代:

a\w*e\w*i\w*o\w*u

没有_和数字的替代方案:

a[a-z]*e[a-z]*i[a-z]*o[a-z]*u

替代方案中没有重复的元音:

a[b-df-hj-np-tv-z] #repeat

答案 1 :(得分:2)

你正在跳过一半的输入。

每次出现都会读一行;你打电话给它两次。第一次将结果分配给$ _(默认代词),将其丢弃。

尝试放

     while (my $word = <INFILE>) 

避免丢弃所有其他输入行。

答案 2 :(得分:1)

您排除只有1 a且出现在开头的情况。请注意,元音区分大小写,而其他字符则不区分。

由于你没有进行锚定匹配(匹配整个输入字符串,而不是允许匹配在输入字符串的中间任意开始和结束),你可以这样写:

/[Aa][a-zA-Z]*[Ee][a-zA-Z]*[Ii][a-zA-Z]*[Oo][a-zA-Z]*[Uu]/

或者您可以打开不区分大小写的标记i

/a[a-z]*e[a-z]*i[a-z]*o[a-z]*u/i

DEMO

上述答案的唯一假设是a之前和u之后的其他单词都是英文字母。

如果你想确保整个字符串只包含英文字母,并且有模式,你需要一个锚定的匹配:

/^[a-z]*a[a-z]*e[a-z]*i[a-z]*o[a-z]*u[a-z]*$/i

这是最严格的形式,对单词中的所有字符进行验证,并禁止@#$garblesdifdoup@#进行匹配。