2013-12-16 67 views
1

我有一个要求,我会检查文件中每行的长度使用perl-regex和正则表达式应该匹配只有当长度是9或10个字符长。perl正则表达式匹配字符串长度

当前正则表达式:/^(.{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 
+1

确保您使用['M'修饰符(http://regex101.com/r/sZ9yA7)。 – HamZa

+2

你最近表现如何?知道这一点非常重要。我们总是可以做出假设,但从长远来看,猜测会很乏味。发布包含输入的工作代码,显示它输出的内容以及您期望输出的内容。 – TLP

+3

您是否逐行读取样本输入行?你会得到哪些结果?你需要提供更多的细节,正则表达式本身确实看起来不错。 – stema

回答

3

正则表达式是正确的。 (尽管如此,外部括号是不必要的)。

在一个正则表达式测试仪,如果您使用的是测试一个多行字符串,您需要使用mg修饰符:http://regex101.com/r/tI3iA3

在你的代码,这意味着:

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

我在我的“框架“ s/^(。{9,10})$/TEMP $ 1/gm。 但不知何故“TEMP”变量没有正确的信息线明智,虽然你已经显示的例子是完美的。 – user1933888

+0

真的很喜欢你的regex101.com链接 – nrathaus

+0

@ikegami:谢谢,我对Perl很陌生;我根据RegexBuddy的建议编辑了代码示例 - 这是否更好? –

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); 
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 
+0

你永远不应该使用'_utf8_on'。如果你这样做,你做错了什么。在这种情况下,你需要'$ line = Encode :: decode('utf8',$ line);'','$ line = Encode :: decode_utf8($ line);','utf8 :: decode($ line); '等。 – ikegami

+0

'~~'是实验性的,并在5.18+中发出警告 – ikegami

+0

这将比正则表达式解决方案慢很多。 – ikegami