我正在尝试编写一个正则表达式来匹配这一行:
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菜鸟(这是我的第一天),也是一个regex菜鸟,感谢您的帮助!
发布于 2011-01-26 10:47:53
嗯,你有的零件不太正确。我认为你指的是[0-3][0-9],而不是[0-30-9],其他数字也是如此。
然而,通常情况下,它只要稍微松一点就足够了,只需使用与[0-9]等效的\d即可。
将这些部分一个接一个地串在一起:
/\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-3]\d (January|February|March|April|May|June|July|August|September|October|November|December) [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/婴儿床单
characters
匹配
发布于 2011-01-26 10:42:53
[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)称为“alternation”。
时间是一个问题:)这很好,很简单,但是可以匹配29:59这样的时间。哈哈。您可以使用alternation更好地做到这一点:(\d|1\d|2[0-3]) --不太清晰,但更准确。
对于使用regexp的Perl新手,我的建议是从小处开始,迭代地构建它们。这需要付出努力。:)
发布于 2011-01-26 10:48:18
CPAN在Regexp:: common ::*分支中有一些常见的Regexp。对于您的案例,请查看http://search.cpan.org/perldoc?Regexp::Common::time。
也许我应该补充一点,因为您是Perl的新手,所以CPAN是Perl的用户贡献的任务模块的集合。许多人们可能想要做的事情以前已经做过了,并为你收集了。为了安装你可以做的事情sudo cpan modulename (假设你是在Linux上,我相信你可以在mac和windows上找到CPAN的说明,但我不知道)。
https://stackoverflow.com/questions/4800935
复制相似问题