我正在尝试编写一个正则表达式来匹配这一行:
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(这是我的第一天)和正则表达式菜鸟,所以非常感谢!
答案 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/
婴儿床单
答案 2 :(得分:0)
CPAN在Regexp :: Common :: *分支中有一些常见的正则表达式。对于您的情况,请查看http://search.cpan.org/perldoc?Regexp::Common::time。
也许我应该补充一下,因为你是Perl的新手,CPAN是Perl用户贡献的任务模块集合。人们可能想要做的许多事情已经在之前完成并为您收集。要安装你可以做的事情sudo cpan modulename
(假设你在Linux上,我相信你可以在mac和windows上找到关于CPAN的说明,但我不知道它们。)