2013-12-16 66 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