匹配单词开头的任何子字符串

时间:2011-07-19 12:42:42

标签: regex perl

例如,对于previous这样的行,我希望模式与行pprpreprev等匹配。 ,一直到previous。我不希望它匹配prevalentprevise等行。 除了显而易见的(^(p|pr|pre|prev|...|previous)$)之外,还有一种模式可以实现这一目标吗?

注意:我不需要像上面的模式那样捕获它,并且 我正在使用Perl的正则表达式(在Perl中)。

3 个答案:

答案 0 :(得分:8)

/^p(r(e(v(i(o(u(s)?)?)?)?)?)?)?$/

只是仔细检查它是否有效:

for (qw/p pr pre previous prevalent previse/) {
    $result = (/^p(r(e(v(i(o(u(s)?)?)?)?)?)?)?$/? "yes" : "no");
    print "Checking $_: $result\n";
}

产地:

Checking p: yes
Checking pr: yes
Checking pre: yes
Checking previous: yes
Checking prevalent: no
Checking previse: no

答案 1 :(得分:1)

我不认为正则表达式是最好的(或最可读的)方法:

$str = "previous";
$input = "prev";
$length = length($input);

$strcheck = substr($str, 0, $length);
$incheck = substr($input, 0, $length);

if ($strcheck =~ $incheck && $length != 0) {
    // do something with $input
}

答案 2 :(得分:0)

#!/usr/bin/perl
use strict;
use warnings;

my $string = "previous"; 
my @array = split //,$string;

chomp(my $input=<STDIN>); #take the input from the user
my @array2 = split //,$input;

my $i=0;

foreach (@array2){
        if($_ eq $array[$i]){
            print "$_ matched\n";
        }
$i++;
}