首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >掌握Perl中的正则表达式

掌握Perl中的正则表达式
EN

Stack Overflow用户
提问于 2011-01-26 10:31:07
回答 3查看 482关注 0票数 1

我正在尝试编写一个正则表达式来匹配这一行:

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菜鸟,感谢您的帮助!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-01-26 10:47:53

嗯,你有的零件不太正确。我认为你指的是[0-3][0-9],而不是[0-30-9],其他数字也是如此。

然而,通常情况下,它只要稍微松一点就足够了,只需使用与[0-9]等效的\d即可。

将这些部分一个接一个地串在一起:

代码语言:javascript
复制
/\d\d (MONTH) \d\d\d\d at \d\d:\d\d/

可以更简洁地写成:

代码语言:javascript
复制
/\d\d (MONTH) \d{4} at \d\d:\d\d/

或者,如果你真的需要更严格,就像你的公式一样:

代码语言:javascript
复制
/[0-3]\d (MONTH) [0-2]\d{3} at \d\d:\d\d/

我把月份部分留到了最后,因为它比较复杂。同样,你可以是宽松的,也可以是严格的。

松散地说:

代码语言:javascript
复制
/[0-3]\d [A-Za-z]+ [0-2]\d{3} at \d\d:\d\d/

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

代码语言:javascript
复制
/[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'),那么你需要将其设置为可选的:

代码语言:javascript
复制
/[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

  • \d []用于创建字符类,一组匹配的matched

  • is是内置的相当于0-9的字符类
  • ()用于创建组,用于定界替换(其中)
  • |用于创建替换,应该匹配的替换字符序列的列表
  • {n}是修饰符,确切地说前面的字符或字符类的'n‘应该是修饰符,说出一个或多个前面的字符或字符类应该是matched

  • ?是一个修饰符,表示前面的字符或字符类中的0或1应该与

匹配

票数 1
EN

Stack Overflow用户

发布于 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新手,我的建议是从小处开始,迭代地构建它们。这需要付出努力。:)

票数 2
EN

Stack Overflow用户

发布于 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的说明,但我不知道)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4800935

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档