选择多个匹配

时间:2013-10-20 10:09:56

标签: c# regex

我一直在努力寻找一些关于如何实现目标的方法。

我得到了什么:

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

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

我需要实现的目标:

示例:

ACCOUNT{username:test}{password:pass}{email:demo@example.com}

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

此代码用于:

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));
}

这样我最终会得到'username:test','password:pass'等等。

(目前我只得到一场比赛。)

编辑:代码正常工作,人们可以将其用作参考。

2 个答案:

答案 0 :(得分:2)

您从Substring而不是data中提取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]);
}

答案 1 :(得分:1)

尝试简单:

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

或者,将键和值分开:

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

并像这样使用它:

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