perl正则表达式匹配字符串长度

时间:2013-12-16 11:21:15

标签: regex perl

我有一个要求,我将使用perl-regex检查文件中每一行的长度,并且只有当长度为9或10个字符长时,才能匹配正则表达式。

当前正则表达式:/^(.{9,10})$/

Sample input:
D   ABCD12
D   ABCD1
D   ABCD123
D   ABCD12
D   ABCD
D   ABCD1

"D   ABCD123""D   ABCD",不应匹配剩余的匹配。

不知怎的,我的正则表达式并没有给我预期的结果,我哪里出错?

我在这里测试: http://www.regexplanet.com/advanced/perl/index.html

根据评论添加以下详细信息: (我正在使用一些糟糕的内部框架进行这些匹配)。 我的测试结果: 1)输入如上,正则表达式如上所述 2)选择m(多行)和g(全局)选项

Output:
$var = $input =~ /$regex/g
$var=1
$`=D   ABCD12 

$&=D   ABCD1 
$'=
D   ABCD123 
D   ABCD12 
D   ABCD 

-----------------------------------------
split($regex, $input)
[0]=D   ABCD12 

[1]=D   ABCD1 
[2]=
D   ABCD123 
D   ABCD12 

[3]=D   ABCD 
[4]=

[5]=D   ABCD1
D   ABCD1

4 个答案:

答案 0 :(得分:4)

正则表达式是正确的。 (但外括号是不必要的。)

在正则表达式测试程序中,如果您使用多行字符串进行测试,则需要使用mg修饰符:http://regex101.com/r/tI3iA3

在您的代码中,这意味着:

@var = $input =~ m/^.{9,10}$/mg;

答案 1 :(得分:2)

这对我有用 - 我认为你的正则表达式很好,所以问题必须是你在线阅读并对正则表达式进行测试的方式。

use strict;

open(FILE,"<test.txt");
while (my $line = <FILE>) {

    chomp($line);

    if ($line =~ /^(.{9,10})$/) {
        print "Matched\n";
    } else {
        print "Not Matched\n";
    }

}
close(FILE);

答案 2 :(得分:0)

您可以使用以下代码执行此操作:

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

while (my $line = <DATA>) {
    chomp($line);

    print "\n$line\t";

    if ( length(Encode::decode_utf8($line)) ~~ [9..10] ) {
        print "true";
    } else {
        print "false";
    }
}

__DATA__
D   ABCD12
D   ABCD1
D   ABCD123
D   ABCD12
D   ABCD
D   ÄŒcd1

答案 3 :(得分:0)

我猜你的输入实际上有拖尾空白。这看起来像大型机的东西,大型机喜欢留下尾随空白。尝试修剪尾随空白,首先使用s/\s+$//进行匹配。