2012-05-30 66 views
0

一些能告訴我什麼是了的我正則表達式表達:正則表達式表達不返回正確的稱呼

expression = (?<=current run date :)([^\.]*?) 
searchString = date : 2012-05-26 03:00:00.000 to current run date : 2012-05-26 04:00:00.000 

表達是目前我正則表達式搜索詞。我不斷得到一個正確的比賽,但它不會返回我想要的,它會返回「」。

下面是值,這就是我正在看的正則表達式返回。

value = 2012-05-26 04:00:00.000 

所以在字符串中的最後日期。我使用c#.net 4.

謝謝。

回答

0

要返回您想要的值,您必須從第一個捕獲組$1中獲取值,但必須刪除? char。

邏輯sais它將與那個非貪婪的操作符一起工作,但我無法解釋它爲什麼不能。

如果將*乘數更改爲+,您會看到它返回數字和: char之間的第一個空格。

1

的回答你的問題是在最後:「給我匹配0個或多個字符,並給我儘可能多的」

*?

通常情況下,*手段「儘可能」被稱爲「貪婪匹配」。 ?符號是一個從貪婪匹配轉換爲非貪婪匹配的修飾符,因此實際上它會成爲「給我0個或更多匹配的字符,並儘可能地給我」。在這種情況下,數量最少的是0

所以解決方法是從你的表情刪除?字符:

(?<=current run date :)([^\.]*)

編輯:另外值得一提的是,您使用的是在這裏超前看,但你不需要。前瞻是昂貴的,所以除非需要,否則不應使用它們。您可以將您的正則表達式改成這樣:

current run date :([^\.]*)

你仍然會得到相同的結果,但引擎應該能返回你的結果更快(更小的開銷)。

1

?使零或更多的量詞*以懶惰或非貪婪的方式匹配。換句話說,它會嘗試儘可能少地匹配。在這種情況下,它匹配一個空字符串,因爲這顯然是可能的最少量。所以首先,你需要擺脫那個?

接下來,你的字符序列[^\.]告訴它應該匹配除了時期.任何字符解析器,但您預期的結果包括毫秒部分.000其中明確包含句點。該部分不會與字符序列相匹配,所以相反,您會得到類似2012-05-26 04:00:00的東西。

你可能想要更具體的模式。如果您知道,你會得到這種格式的日期,這樣的事情應該工作:

expression = current run date :\s+(\d{4}\-\d{2}\-\d{2}\s\d{2}:\d{2}:\d{2}\.\d{3}) 

,或者你可以不那麼嚴格,匹配兩個接下來的話

expression = current run date :\s+(\S+\s\S+) 

注意: \d是一個十進制字符[0-9],\s是空格字符,如空格,製表符,新行,\S不是空格字符。

+0

好的小數部分。我忙於糾正他懶惰的操作員,甚至沒有注意到他的正則表達式的核心邏輯被破壞了。 – ean5533