2008-10-16 70 views
4

我想將字符串中的時間(10.00)與日期和時間(「21.01.08 10.00」)匹配。我使用下面的正則表達式:使用正則表達式匹配時間字符串

new RegExp("\\b[0-9]{1,2}\\.[0-9]{1,2}\\b" "g"); 

但是這匹配21.01.08和10.00匹配21.01。

我使用PCRE作爲我的調節表達式引擎。

更新:

對不起,我應該更清楚。數據和時間是較大字符串的一部分。我想從該字符串中提取時間。

例如:

「在08年1月21日從10.00黨將在庫」 「08年8月21日 - 在10:00將有一個黨」 「在08年8月21日你定於... ...開始於10.00「

這可能嗎?

回答

4

您的原始正則表達式不起作用,因爲\b(字邊界)在「。」匹配。在「21.01.08」中。你需要更有力代碼的界限:

(?:[^\d:.]|^)(\d\d?[.:]\d\d)(?![.:\d]) 

這抓住了一次,任你使用的符號,而排除日期。請注意,它不驗證時間。例如,它會匹配「88:99」驗證時間是可能的,但顯着複雜化模式,並可能在大多數情況下矯枉過正。

這將是很好的使用後視,而不是非捕獲分組,但PCRE不支持可變寬度後視。

0

嘗試使用

new RegExp("\\b[0-9]{1,2}\\.[0-9]{1,2}$" "g"); 

$表示字符串

1
^\d{2}\.\d{2}\.\d{2}\s(\d{2}\.\d{2})$ 

的結束應該做的伎倆與正在把部分時間在捕獲組。

「新的RegExp」我不確定(Java也許?)。在Perl中你可以得到的價值像...

if ("21.01.08 10.00" =~ m/^\d{2}\.\d{2}\.\d{2}\s(\d{2}\.\d{2})$/g) { 
    $time_part = $1; 
} 
在.NET下面應該工作

...

Regex r = new Regex(@"^\d{2}\.\d{2}\.\d{2}\s(\d{2}\.\d{2})$"); 
    string dateTimeString = "21.01.08 10.00"; 
    if (r.IsMatch(dateTimeString)) { 
    string timePart = r.Match(dateTimeString).Groups[1].Value; 
    Console.Write(timePart); 
    } 
    Console.ReadKey(); 

您也可以使用Named Capture如果你想少用曖昧的東西,然後進入捕獲組的索引。

+0

我不禁想到`\ d \ d`與\ d {2}一樣容易閱讀;它在打字上更加經濟。如果它超過3(也許高於2),或者你需要一個範圍{3,7},那麼重複是很好的。 – 2008-10-16 16:24:26