2011-05-12 26 views
2

以下面的字符串爲例,我應該使用哪種模式來提取我需要的所有字符串實例?因此,服用:如何在C#中使用正則表達式匹配模式,爲正則表達式提出挑戰?

string Text = @"Dear {Customer.Name}, 
       Lorem ipsum dolor sit amet, {Customer.FirstName}"; 

並提取{Customer.Name}{Customer.FirstName}?作爲獎勵,可以在提取過程中將{}移除?

我在用LinqPad打探,到目前爲止我有new Regex("{[A-Za-z0-9.]+}", RegexOptions.Multiline).Match(Text),但它只匹配{Customer.Name}的第一個子字符串。

我在正則表達式中遇到了很大的挑戰,所以我希望能得到詳細的幫助。

在此先感謝!

回答

7

你的正則表達式看起來不錯。唯一的問題是,您需要撥打Matches而不是Match來獲取輸入字符串中的所有匹配項。

你可以把你想有作爲子組的結果,然後只使用在進一步處理子組的一部分:

var matches = Regex.Matches(Text, "{([A-Za-z0-9.]+)}", RegexOptions.Multiline); 
foreach(Match match in matches) 
{ 
    var variable = match.Groups[1].Value; 
} 
+0

而且它更好使用靜態'Regex.Matches'方法,因爲它會緩存的正則表達式,而不是創建一個新的每次。 (你可以傳遞正則表達式對象,但這很煩人。) – porges 2011-05-12 07:14:59

+1

@Porges:謝謝你的信息!我改變了我的示例代碼。 – 2011-05-12 07:17:22

+0

大聲笑,「匹配」部分就是其中一種你只是在面對自己的事情,想一想你怎麼可能錯過這些事情?我想這只是表明我對正則表達式沒有教育......無論如何,感謝這個例子,我嘗試了LinqPad,它產生了我需要的東西。再次感謝! – Gup3rSuR4c 2011-05-12 07:26:34

2

解決向前看和向後看,沒有必要使用組..

(?<={)[^}]*(?=}) 
+0

好像對我來說過分了。 – 2011-05-12 07:17:03

+0

然而,從代碼維護角度來看,確實很有趣。 – ChrisWue 2011-05-12 07:22:08

+0

+1我喜歡環視 – stema 2011-05-12 07:24:22