2011-01-26 11 views
1

我想寫一個正則表達式這一行匹配:
DD月年在HH:MM
爲例:
21 2009年5月在19:09獲取與正則表達式交手在Perl

所以我有:
[0-30-9]一天
[0-20-90-90-9]全年
[0-90-9:0-90-9]爲時間

我不明白如何把這些放在一起形成e單一的正則表達式。我想要做的

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

但不能形成整個事情。此外,我不知道如何編寫一個月的正則表達式,它必須匹配一年中的一個月。

我是一個Perl noob(這是我的第一天)和正則表達式noob,所以幫助讚賞!

回答

1

那麼,你有的部分是不完全正確的。而不是[0-30-9]我認爲你的意思是[0-3][0-9],而其他數字也是如此。

但是,通常只要稍微寬鬆一點,只需使用\d即相當於[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-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/ 

嬰兒牀片

  • []用於創建人物類,一組匹配的字符
  • \ d的是內置相當於[0-9]
  • ()被用於創建一組,其可用於界定的交替(除其他事項外)
  • 字符類
  • |用於創建交替,即應該匹配替換字符序列的列表
  • 的{N}的改性劑,說正好「n」的前一字符或字符類亦宜
  • +是改性劑,說1或更多前面的字符或字符類應該匹配
  • ?是一種改性劑,說前面的字符或字符類的0或1亦宜
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]) - 較少清晰但更正確。

而我的一個Perl新手使用正則表達式的建議是從開始小並且迭代構建它們。它需要工作。 :)

0

CPAN具有在正則表達式的一些常見的正則表達式::常見:: *分支。爲你的情況檢查出http://search.cpan.org/perldoc?Regexp::Common::time

也許我應該補充,因爲你對Perl是如此的新鮮,CPAN是Perl爲用戶提供的任務模塊的集合。人們可能想要做的許多事情都已經完成,並已爲您收集。要安裝東西,你可以做sudo cpan modulename(假設你在Linux上,我確定你可以在mac和windows上找到CPAN的說明,但我不知道它們)。