$a ="SCNSC: SME@companay.isa.come";
$b ="alerts: nek";
$c ="daily-report: tasd,dfgd,fgdfg,dfgdf,sdf@dfs.com";
print "matched" if ($a =~ /\w+:\s*\w+@\w+\.\w+/ );
print "matched" if ($b =~ /\w+:\s*\w+[,\w+]{0,}/ );
print "matched" if ($c =~ /\w+:\s*\w+[,\w+]{0,}/ );
它没有显示匹配的
答案 0 :(得分: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: SME@companay.isa.come';
$b ='alerts: nek';
$c ='daily-report: tasd,dfgd,fgdfg,dfgdf,sdf@dfs.com';
print "matched\n" if $a =~ /\w+:\s*\w+@\w+\.\w+/ ;
print "matched\n" if $b =~ /\w+:\s*\w+(,\w+)*/ ;
print "matched\n" if $c =~ /\w+:\s*\w+(,\w+)*/ ;
哪个匹配所有字符串。请注意,\w
不包含字符@
,因此它们匹配,但可能不是您想要的。
答案 1 :(得分:2)