2011-04-26 521 views
10

我已經在這個超過沒有成功一個小時,和它做我的頭英寸正則表達式匹配零次或一次一個字符串

我試圖讓這個字符串相匹配的正則表達式{日期HH:MM:ss},但這裏有個竅門,HH,MM和SS是可選的,但它必須是「HH」,而不僅僅是「H」(同樣的事情適用於MM和SS)。如果出現單個「H」,則該字符串不應匹配。

我知道我可以使用H {2}來匹配HH,但我似乎無法使用該功能加上?匹配零次或一次(零是因爲它是可選的,最多一次)。

到目前爲止,我這樣做(這顯然是不工作):

Regex dateRegex = new Regex(@"\{Date H{2}?:M{2}?:s{2}?\}"); 

請幫助我,併爲noob問題抱歉。

FB。

下一個問題,現在我已經匹配了第一個字符串,我只想把HH:MM:ss部分放在另一個字符串中(這將是TimeStamp對象的格式)。

我用同樣的方法,像這樣:

Regex dateFormatRegex = new Regex(@"(HH)?:?(MM)?:?(ss)?"); 

但當我嘗試在 「{日期HH:MM}」 我沒有得到任何比賽,爲什麼?

編輯:如果我添加這樣的空間Regex dateFormatRegex = new Regex(@" (HH)?:?(MM)?:?(ss)?");我有結果,但我不想要空間... 我認爲第一個圓括號需要轉義,但(在此不起作用情況下,我猜是因爲它不是一個parenthese那就是字符串匹配,但一個關鍵字符的一部分。

回答

20

(H{2})?匹配零個或兩個H字符。

然而,你的情況寫了兩次會更可讀:

Regex dateRegex = new Regex(@"\{Date (HH)?:(MM)?:(ss)?\}"); 

除此之外,請確保沒有任何功能可用於您正在嘗試執行的任何操作。解析日期非常常見,大多數編程語言在其標準庫中都有函數 - 我幾乎可以打賭我的聲譽1k,.NET也具有這樣的功能。

+0

我正在爲文件重命名目的的自定義小「語言」更多信息這第二個輸入,日期在這裏並不是指DateTime對象,而是包含在自定義對象中的日期。 – 2011-04-26 22:29:18

+0

這對主要字符串完美工作,看到我的更新問題,發生後,一個非常類似的問題。 – 2011-04-26 22:44:40

+0

無論如何,使用.NET庫可能是值得的。 – ThiefMaster 2011-04-27 06:13:56

1

在你編輯你的結果提不必要的前導空格...檢查領先或不包括這結果,你可以使用正則表達式的環視功能與您的正則表達式一起尾隨條件。

new Regex(@"(?<=Date)(HH)?:?(MM)?:?(ss)?") 

(?< = ...)是一個倒轉的模式。

Regex test site這個例子。

編輯
輸入Date HH:MM:ss將匹配正則表達式兩者(具有或不回顧後)。
但輸入FooBar HH:MM:ss仍將匹配簡單的regex但lookbehinde將在這裏失敗。 Lookaround不會改變結果的內容,但可防止錯誤匹配(例如,這不是一個日期)

找到正則表達式和環視here

+0

我不確定我是否理解了後視圖案的用途,請您進一步解釋一下嗎? – 2011-04-26 23:37:51