如何解析这个?

epi*_*tka 1 c# regex

我需要解析具有以下结构的字符串

x:{a,b,c,},y:{d,e,f}等.

所有条目都是数字,所以它看起来像这样

411:{1,2,3},241:{4,1,2}等

忘记提及:{}之间的逗号分隔条目数没有上限但必须至少有一个条目.

  1. 我需要获得以前的唯一数字列表:,在上面的情况411,241

这可以用正则表达式完成吗?

3Da*_*ave 8

正则表达式:

(?<1>[\d]+):{(?<2>\d+),(?<3>\d+),(?<4>\d+)}
Run Code Online (Sandbox Code Playgroud)

对于数据:

411:{1,2,3},241:{4,1,2},314:{5,6,7}
Run Code Online (Sandbox Code Playgroud)

将生成以下匹配/组集合:

Match 0
Group 0: 411:{1,2,3}
Group 1: 411
Group 2: 1
Group 3: 2
Group 4: 3

Match 1
Group 0: 241:{4,1,2}
Group 1: 241
Group 2: 4
Group 3: 1
Group 4: 2

Match 2
Group 0: 314:{5,6,7}
Group 1: 314
Group 2: 5
Group 3: 6
Group 4: 7
Run Code Online (Sandbox Code Playgroud)

您可以使用以下代码:

string expression = "(?<1>[\d]*):{(?<2>\d),(?<3>\d),(?<4>\d)}";
string input = "411:{1,2,3},241:{4,1,2},314:{5,6,7}";

Regex re = new Regex(expression, RegexOptions.IgnoreCase);

MatchCollection matches = re.Matches(input);

for (int i = 0; i < matches.Count; i++)
{
Match m = matches[i];
// for i==0
// m.groups[0] == 411:{1,2,3}
// m.groups[1] == 411
// m.groups[2] == 1
// m.groups[3] == 2
// m.groups[4] == 4
}
Run Code Online (Sandbox Code Playgroud)

更新 无法使用纯正则表达式和列表中可变数量的项目 - 也许其他人可以在此处进行操作.一个简单的解决方案是:

string expression = "(?<1>[\d]+):{(?<2>[\d,?]+)}";
string input = "411:{1,2,3,4,5},241:{4,1,234}";

Regex re = new Regex(expression, RegexOptions.IgnoreCase);

MatchCollection matches = re.Matches(input);

for (int i = 0; i < matches.Count; i++)
{
Match m = matches[i];
// for i==0
// m.groups[0] == "411:{1,2,3}"
// m.groups[1] == "411"
// m.groups[2] == "1,2,3"
int[] list = m.Groups[1].Split(",");
// now list is an array of what was between the curly braces for this match
}
Run Code Online (Sandbox Code Playgroud)

上面的比赛清单:

Match 0
Group 0: 411:{1,2,3,4,5}
Group 1: 411
Group 2: 1,2,3,4,5

Match 1
Group 0: 241:{4,1,234}
Group 1: 241
Group 2: 4,1,234
Run Code Online (Sandbox Code Playgroud)