2010-11-11 22 views
-3

我需要解析字符串,它看起來像下面的例子中:太貪婪正則表達式的問題

Regex TitleRegex = new Regex(@"[A-Z].* - ([0-9].*) [A-Z]"); 
var match = TitleRegex.Match("Chapter - 1 The Brown Fox"); 
Console.WriteLine(match.Groups[1].Value); 

我想是提取一個數字。問題是輸出是1 The Brown而不是簡單的1
我不明白爲什麼字母也包含在數字([0-9])模式中。

有什麼建議嗎?

回答

3
Regex TitleRegex = new Regex(@"[A-Z].* - ([0-9]{1,2}) [A-Z]"); 

您捕捉.通常是比賽以外的所有新生產線。我把{1,2}量詞放在那裏,這意味着它將匹配0-99。根據您的要求更改它(或者您可以將其保留爲0或更多*)。

你能不能也用\d代替[0-9]。速記通常是一件好事:)

+0

謝謝!這是一個愚蠢的複製粘貼錯誤。我已經打破了我的頭來解決這個%) – levanovd 2010-11-11 13:08:32

1

答案是,你似乎濫用量詞;

[0-9].* 

即部分圖案的任何單個數字(0-9)一次匹配,然後在所有(。)0次或多次(*)

任何字符中的星號之前取出點。

[0-9]* 
2

的字母包括在內,因爲你問他們,當您添加.*到捕獲組。儘量只([0-9]+)或更好(\d+)

0

更改爲:

"[A-Z].* - ([0-9]?) [A-Z]" 

當你使用它[0-9].*搜索一個數字加上0或多個符號,使用[0-9]+爲您提供了特定地方的一個或多個整數。如果你確定不會超過可以說3個整數,那麼你可以使用[0-9]{1,3}或者你想要的4,5等等。