在Perl中掌握正则表达式

时间:2011-01-26 02:31:07

标签: regex perl expression

我正在尝试编写一个正则表达式来匹配这一行:
HH的DD月份:MM
举个例子:
2009年5月21日19:09

所以我有:
当天的[0-30-9] [0-20-90-90-9]为年 时间[0-90-9:0-90-9]

我不明白如何将这些全部组合在一起形成一个正则表达式。我想做

if($string =~ /myregex/) { }

但不能形成整个事物。此外,我不知道如何写一个月的正则表达式,它必须匹配一年中的12个月中的一个。

我是Perl noob(这是我的第一天)和正则表达式菜鸟,所以非常感谢!

3 个答案:

答案 0 :(得分:2)

[0-30-9]没有按照您的想法行事。 :)

[0-3][0-9]就是你所追求的。每个其他输入的类似步骤......

[0-3]?\d (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) \d\d\d\d at [012]\d:[0-5]\d

?是指可能的前导数字。

\d表示'数字',有时更清晰。

(foo|bar|baz)被称为'交替'。

时间问题:)这很好而且简单,但是会像29:59那样匹配。呵呵。你可以通过交替更好地做到这一点:(\d|1\d|2[0-3]) - 不太清晰但更正确。

我对使用regexp的Perl新手的建议是从小开始并迭代地构建它们。这需要工作。 :)

答案 1 :(得分:1)

嗯,你所拥有的部件并不完全正确。而不是[0-30-9]我认为你的意思是[0-3][0-9],而其他数字也是如此。

但是,通常只需稍微宽松一点就可以使用等同于\d的{​​{1}}。

将各个部分依次串在一起:

[0-9]

可以更简洁地写成:

/\d\d (MONTH) \d\d\d\d at \d\d:\d\d/

或者,如果你真的需要它比你的配方更严格:

/\d\d (MONTH) \d{4} at \d\d:\d\d/

我把月份留到了最后,因为它是更复杂的一点。你可以再次宽松或严格。

松散:

/[0-3]\d (MONTH) [0-2]\d{3} at \d\d:\d\d/

对于严格匹配,我们可以使用替换,每个替代都用'|'分隔选项列表括在括号中(尽管要注意,括号也有另外一个含义;不要担心它不会干扰这种情况):

/[0-3]\d [A-Za-z]+ [0-2]\d{3} at \d\d:\d\d/

最后,如果这一天不是0填充(意味着第一个只是'1'而不是'01')那么你需要做出选择:

/[0-3]\d (January|February|March|April|May|June|July|August|September|October|November|December) [0-2]\d{3} at \d\d:\d\d/

婴儿床单

  • []用于创建一个字符类,一组匹配的字符
  • \ d是一个等同于[0-9]
  • 的内置字符类
  • ()用于创建一个组,用于分隔交替(除其他外)
  • |用于创建交替,一个应匹配的替代字符序列列表
  • {n}是一个修饰符,表示前面的字符或字符类的'n'应该匹配
  • +是一个修饰符,表示应匹配前面一个或多个字符或字符类
  • ?是一个修饰符,表示前面的字符或字符类中的0或1应匹配

答案 2 :(得分:0)

CPAN在Regexp :: Common :: *分支中有一些常见的正则表达式。对于您的情况,请查看http://search.cpan.org/perldoc?Regexp::Common::time

也许我应该补充一下,因为你是Perl的新手,CPAN是Perl用户贡献的任务模块集合。人们可能想要做的许多事情已经在之前完成并为您收集。要安装你可以做的事情sudo cpan modulename(假设你在Linux上,我相信你可以在mac和windows上找到关于CPAN的说明,但我不知道它们。)