2013-12-20 59 views
2

我有問題使用RegEx匹配從給定的字符串中提取值,我正在使用的字符串如下。簡單的C#正則表達式匹配問題

533 X1981毫米,35毫米厚 - 非防火門:£33.14

正則表達式我有,如果字符串如下

533 X1981毫米工作正常, 35毫米厚:£33.14

^(?<first>\d+)\s*x\s*(?<second>\d+)mm,\s*(?<third>\d+)mm Thick: £(?<price>\d+\.\d+)$ 

我的問題是,我怎樣才能改變重gEx忽略最後'mm'和'£'符號之間的任何內容?

我的代碼會提取毫米測量值,將它們轉換爲英寸並將字符串返回給我的方法。其餘的代碼如下。

var first = Int32.Parse(match.Groups["first"].Value); 
var second = Int32.Parse(match.Groups["second"].Value); 
var third = Int32.Parse(match.Groups["third"].Value); 
var price = Decimal.Parse(match.Groups["price"].Value, CultureInfo.InvariantCulture); 

謝謝大師!

+1

也許我不明白你的問題,但shuldn​​'t'^(? \ d +)\ s * X \ S *(? \ d +)毫米,\ S *(? \ d + )mm。*£(? \ d + \。\ d +)$'訣竅? –

+0

應該盡我所能地工作 - 但。*是危險的,因爲你會得到一個貪婪的匹配。如果您只希望在匹配的mm之後看到一個數字如下:£00.00,那麼這很好。編輯實際上作爲匹配後的字符串的結束,然後是的,沒有後顧之憂,應該工作 –

回答

3

mm Thick: £替換爲mm.*?£

.*?指「匹配任何字符(.)任意次數,包括零(*),如幾次儘可能(?)」

+0

在這種情況下不需要懶惰運算符'?',因爲字符串'$'的末尾匹配後量。它更好地擁有貪婪的匹配而不是懶惰的,因爲正則表達式引擎不需要經常回溯:參見[link](http://www.regular-expressions.info/repeat.html) –

+0

你是對的以及您的其他評論),這不會影響輸出。然而,我希望在通常的「只有一個」情況下這會更有效率 - 它會捕獲,直到它遇到英鎊符號,然後馬上繼續匹配價格,而不是捕獲所有內容,在字符串的末尾匹配一個'£',然後從貪婪的匹配中逐個字符地回溯,直到它再次找到'£'。 – Rawling

+0

如果我已經正確地閱讀了正則表達式引擎如何工作,然後沒有。對於測試字符串中的每個字符(而惰性匹配),使用懶惰重複運算符'。?'檢查前面的字符是否匹配,然後是否回溯到測試字符後面的字符,然後重複。要按照你的描述使用它,你可以使用@MarkO –

1

使用[^£]+,得到1個或多個字符不屬於一個£。

^(?<first>\d+)\s*x\s*(?<second>\d+)mm,\s*(?<third>\d+)mm[^£]+£(?<price>\d+\.\d+)$