2011-05-12 33 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