我有一个要求,我将使用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
答案 0 :(得分:4)
正则表达式是正确的。 (但外括号是不必要的。)
在正则表达式测试程序中,如果您使用多行字符串进行测试,则需要使用m
和g
修饰符: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+$//
进行匹配。