2013-10-20 81 views
1

我一直在尝试并寻找一段时间来了解如何实现我的目标。选择多个匹配

我有什么:

(?<={).*?(?=}) 

这类作品,但不会递归检查匹配。

我需要实现:

例子:

ACCOUNT{username:test}{password:pass}{email:[email protected]} 

我需要得到的是所有里面的文字{和}。

此代码正在被使用:

Regex r = new Regex("(?<={).*?(?=})"); 
MatchCollection mc = r.Matches(data); 

foreach (Match m in mc) 
{ 
    dataCont.addData(m.Value.Substring(0, m.Value.IndexOf(':')), 
        m.Value.Substring(m.Value.IndexOf(':') + 1)); 
} 

所以,我会结了“用户名:测试”,“密码:通”等。

(目前我只得到了1场。)

编辑:的代码工作,人们可以用它作为参考。

+0

我不知道很多正则表达式,但检查是否允许迭代匹配 –

回答

1

尝试简单:

\{(?<data>.*?)\} 

或者,分离出键和值:

\{(?<key>.*?):(?<value>.*?)\} 

而且使用这样的:

foreach(Match m in matches) 
{ 
    var key = m.Groups["key"].Value; 
    var value = m.Groups["value"].Value; 
} 
+0

我不确定您的示例将如何使用? ,是令人困惑的部分。我应该在那里输入价值吗?如果是这样,那么这不是我要找的。键的方式会有所不同,因为它们所用的方法被用于很多不同的事情。 – Dartz

+0

* key *和* value *是正则表达式组的名称。当使用这种方法时,您需要迭代正则表达式返回的捕获,如下所示:\t var input = @“ACCOUNT {username:test} {password:pass} {email:[email protected]}”; \t var pattern = @“\ {(?。*?):(?。*?)\}“; \t变种正则表达式=新的正则表达式(模式);在regex.Matches \t的foreach(匹配捕获(输入)) \t { \t \t Console.Out.WriteLine(capture.Value); \t} 输出是: {用户名:测试} { 密码:通} { 电子邮件:[email protected]}? 我写了评论,因为这是一个良好和正确的答案 – pasty

+0

语法( .. )只是一种命名每个捕获组的方法,所以不必通过索引访问每个组,而是可以访问i按名称。另外,分离出正则表达式中的数据看起来比手动分割字符串更加奇妙! – Chris

2

您从data提取Substring而不是m.Value

变化

dataCont.addData(
     m.Value.Substring(0, data.IndexOf(':')), 
     m.Value.Substring(data.IndexOf(':')+1)); 

dataCont.addData(
     m.Value.Substring(0, m.Value.IndexOf(':')), 
     m.Value.Substring(m.Value.IndexOf(':')+1)); 

而且,不但得不到串您可以使用字符串Split方法 -

foreach (Match m in mc) 
{ 
    string[] keyValue = m.Value.Split(':'); 
    dataCont.addData(keyValue[0], keyValue[1]); 
} 
+0

虽然这不是问题,但这是一个问题:) – Dartz

+0

我并不是说这是答案,这是帮助我解决另一个问题,我完全错过了。原来的问题仍然存在。 – Dartz

+0

经过这次编辑,虽然我得到三个匹配您的示例输入。我怀疑问题必须在你的方法'addData'中。你可以用调试器计数mc值吗? –