2010-06-10 40 views
-1
$a ="SCNSC:           [email protected]"; 
$b ="alerts:           nek"; 
$c ="daily-report:       tasd,dfgd,fgdfg,dfgdf,[email protected]"; 

print "matched" if ($a =~ /\w+:\s*\[email protected]\w+\.\w+/); 
print "matched" if ($b =~ /\w+:\s*\w+[,\w+]{0,}/); 

print "matched" if ($c =~ /\w+:\s*\w+[,\w+]{0,}/); 

其不顯示匹配我的正則表達式不匹配

+2

讓愚蠢的錯誤根據反應而未經處理,否則反應就變得沒有意義。這就是爲什麼我回滾你的編輯。 – msw 2010-06-10 12:51:07

+0

如果您曾經使用'use strict;使用警告;'從一開始你的所有代碼中,問題就會變得明顯。現在你知道了,所以你永遠不會再忽略它。對? – Ether 2010-06-10 15:02:15

回答

7

-W警告選項是你的朋友:

$ perl -W sample .pl 
Possible unintended interpolation of @companay in string at junk.pl line 1. 
Possible unintended interpolation of @dfs in string at junk.pl line 3. 
Name "main::companay" used only once: possible typo at junk.pl line 1. 
Name "main::dfs" used only once: possible typo at junk.pl line 3. 

所以$a$c不包含文字@companay@dfs他們包含一個空的(未定義)數組插入它們的位置。表達式{0,}相當於*(意思是零個或多個),所以讓我們來清理它,並且Perl已經有太多標點符號了,所以讓我們刪除不需要的括號。這給我們的唯一匹配的Perl沒提醒我們:

print "matched" if $b =~ /\w+:\s*\w+[,\w+]*/ ; 

這是很好的,除了你可能是指使用分組括號的正則表達式的最後部分,而不是「字符類的零個或多個字符的字符串含,\w+修復這一切的產量:。

$a ='SCNSC: [email protected]'; 
$b ='alerts:  nek'; 
$c ='daily-report: tasd,dfgd,fgdfg,dfgdf,[email protected]'; 

print "matched\n" if $a =~ /\w+:\s*\[email protected]\w+\.\w+/ ; 
print "matched\n" if $b =~ /\w+:\s*\w+(,\w+)*/ ; 
print "matched\n" if $c =~ /\w+:\s*\w+(,\w+)*/ ; 

已經匹配的所有字符串注意\w不包含字符@所以它們匹配,但也許不正是你想要的

+0

問題變了.. – Tree 2010-06-10 12:40:04

+0

在正則表達式中是否有任何錯誤 – Tree 2010-06-10 12:40:38

+0

答案改變了,是的,正則表達式也被破壞了 – msw 2010-06-10 12:47:14

2

總是在腳本的頂部添加use strict;use warnings;

它會給你的注意力帶來愚蠢的錯別字等。

此外,避免使用$a$b作爲變量名稱,因爲它們特別爲sort函數保留。