这个模式不匹配,奇怪

这个模式不匹配,奇怪

/[0-12]:[0-59]/ 可以匹配 12:00

但是 /[0-12]:[0-59]am/ 却不能匹配 12:00am,这是咋回事呢?

多谢指教,我刚学。


QUOTE:
原帖由 xdwjack 于 2008-3-22 16:03 发表
/[0-12]:[0-59]/ 可以匹配 12:00

但是 /[0-12]:[0-59]am/ 却不能匹配 12:00am,这是咋回事呢?

多谢指教,我刚学。

[]只能用来匹配一个字符
[0-59]匹配的只是一个字符,0到5和9
所以

QUOTE:
<lig@other-server:~>$ perl -e '$_="12:00"; print "Matched at  <$&> \n" if /[0-12]:[0-59]/;'
Matched at  <2:0>

你第一个正则匹配的只是2:0
而不是你想象的12:00
明白了吧?
instead you should write your regex as follows:

QUOTE:
<lig@other-server:~>$ perl -e '$_="12:00"; print "Matched at  <$&> \n" if /(0[0-9]|1[0-2]):[0-5][0-9]/;'
Matched at  <12:00>
<lig@other-server:~>$ perl -e '$_="12:00am"; print "Matched at  <$&> \n" if /(0[0-9]|1[0-2]):[0-5][0-9]am/;'
Matched at  <12:00am>

谢谢churchmice,我明白了你在3楼给出的解决方案,我认为那是最正确的。但是下面的代码运行结果让我感到很迷惑:

#! c:/Perl/bin/perl -w

print "Please input the time:";
$in = <STDIN>; chomp $in;
if($in =~/[0-12]:[0-59]/)
{print "The format is good!";}
else
{print "The format is not good!";}



D:\>perl re.pl
Please input the time:12:00
The format is good!

那么就是说12:00还是匹配了。是怎么匹配的我还真是想不通。多谢指教。


QUOTE:
原帖由 xdwjack 于 2008-3-22 17:16 发表
谢谢churchmice,我明白了你在3楼给出的解决方案,我认为那是最正确的。但是下面的代码运行结果让我感到很迷惑:

#! c:/Perl/bin/perl -w

print "Please input the time:";
$in = ; chomp $in;
if($in  ...



[Copy to clipboard] [ - ]
CODE:
/[0-12]:[0-59]/

这一regex匹配的内容是
1. 0,1,2中的一个数字
2. 接下来是一个":"
3. 接下来是"0,1,2,3,4,5,9"中的任一一个数字

你输入12:00当然是能匹配的
因为其子字符串2:0是匹配这一regex,这在2楼代码中也体现了
你可以用^显示的指明从字符串的开头开始匹配

[Copy to clipboard] [ - ]
CODE:
/^[0-12]:[0-59]/

这样你再试试,你的代码就挂了

如果你想具体看正则引擎是如何工作的
[code]
#!/usr/bin/perl
use strict;
use warnings;
$_="12:00";
/(?{print "Starting match at $`|$'\n"})[0-12]:[0-59](?{print "Matched at $`<$&>$'\n"})/;
[code]

QUOTE:
Starting match at 1|2:00
Matched at 1<2:0>0

谢谢,太感谢了,讲得太详细了!我明白了!
初学,单个的概念我还能答上来,真要解决问题的时候,实在是顾得上这个就顾不上那个。你提醒了我,一定要把东西学扎实,学细。