2010-11-22 90 views
0

您如何分解(或不)以下行?Perl的正則表達式語法

if ($Hour =~ /^(\d{2})(\d{2})(\d{2})$/) { $result = "$1:$2:$3" } 
+4

「因式分解」與正則表達式?你的意思是這樣嗎? ($ N =('o'x shift); $ N =〜/ ^(oo +?)\ 1 + $ /; $ N =〜s/$ 1/o/g){print length($ 1) 「} print length($ N),」\ n「;':) – tchrist 2010-11-22 13:07:17

回答

3

首先,不要使用\d,除非要匹配所有的Unicode數字字符(如𝟚或᠕)。如果你想匹配零到九,你必須說[0-9]

不幸的是,因爲你關心的所有比賽,並且將只保存最後一條,你不能縮短,爲

if ($Hour =~ /^([0-9]{2}){3}$/) { $result = "$1:$2:$3" } 

。同樣地

if ($Hour =~ /^([0-9]{6})$/) { $result = "$1:$2:$3" } 

不在。你可以說

($result = $Hour) =~ s/([0-9]{2})(?!$)/$1:/g; 

但你會交易清晰度略短的一行。

+0

在「近期」perls中,你可能會使用'\ p {POSIX_Digit}',但這在打字方面並不是很好。 – tchrist 2010-11-22 13:08:24

3

看起來很不錯,因爲它是。

如果需要,您可以用另一個\d替換每個{2}

您可以使用$result=join":",$Hour=~/^(\d\d)/g,但它不是嚴格的 - 它會匹配任何行開始處的任何長度爲偶數的字符串。

+0

它會抓取任何一對數字,無論它們是否緊跟前一對。 – ysth 2010-11-22 11:11:07

1

看起來不錯。匹配時間可以採取各種嚴格程度。 上面將允許像999999

的另一種方法,以匹配24小時的時鐘是使用

([01]?[4-9]|[012]?[0-3]) 

爲一小時的部分,然後

[0-5][0-9] 

爲分鐘。

或(對於它的樂趣),一小時的部分也可以用

([01]?[0-9]|2[0-3]) 
+0

你的小時部分reg exp。看起來奇怪..它如何匹配像23? – 2010-11-22 13:48:06

+0

-1:正則表達式是錯誤的。作爲之前的評論問題,您的第一個小時部分正則表達式與「23」不匹配。更糟糕的是,它*不匹配'1703',但不匹配'10','12','06' ......第二個「爲了它的樂趣」版本顯然不匹配任何小時,不包括' 2',因爲它需要在2之前的1-2個數字和在1之後的1個數字,它將不能匹配任何一個或兩個數字的數字。 – 2010-11-22 15:58:07

+0

我覺得有些人誤入歧途 – ysth 2010-11-22 16:23:57

1

我會用\z代替$,除非你真的要允許一個可選尾部的換行符匹配。除此之外(以及變量的大小寫不一致),沒關係。