正则表达式 - 这是嵌套还是递归 - 甚至可能?

时间:2016-03-15 23:32:28

标签: c# regex

任何人都可以用正则表达式帮我解决这个问题:

[x: {aaa}] blablabla [x: {bbb}, {ccc}] blablabla [y: {ddd}]

必需: aaa bbb ccc

即。查找[x: ]然后用大括号括起来 - 忽略[y: ]

中的任何内容

甚至可能吗?

1 个答案:

答案 0 :(得分:2)

在C#中,您可以使用非正则表达式方法(如果您的数据始终格式良好):

var s = "[x: {aaa}] blablabla [x: {bbb}, {ccc}] blablabla [y: {ddd}]";
var res = s.Split('[', ']')          // Split with `[` and `]`
   .Where(q => q.StartsWith("x: "))  // Only get those elements starting with x:
   .SelectMany(m => m.Trim().Substring(4, m.Length - 5).Split(new[] { "}, {" }, StringSplitOptions.None))
   .ToList();                        // Convert to a List<string> all the elements

enter image description here

如果数据格式不正确,则最好使用正则表达式。这是你可以使用的一个:

@"\[x:\s*{(?<val>[^}]*)}(?:\s*,\s*{(?<val>[^}]*)})*"

故障:

  • \[x:\s* - 一系列字符[x:后跟0 +空格
  • {(?<val>[^}]*)} - 一个{...}子字符串,其内部部分被捕获到名为“val”的命名捕获组中(它有一个堆栈,用于捕获所有可访问的值)通过Match.Groups["val"].Captures
  • (?:\s*,\s*{(?<val>[^}]*)})* - 0+序列:
    • \s*,\s* - 0+空格后跟逗号,0 +空格
    • {(?<val>[^}]*)} - 与上述相同,向“val”组堆栈添加更多值。

请注意,在这种情况下,“val”不能包含}请参阅regex demo,只需抓住 match.Groups["val"].Captures 即可。

var s = "[x: {aaa}] blablabla [x: {bbb}, {ccc}] blablabla [y: {ddd}]";
var res = Regex.Matches(s, @"\[x:\s*{(?<val>[^}]*)}(?:\s*,\s*{(?<val>[^}]*)})*")
        .Cast<Match>()
        .SelectMany(p => p.Groups["val"].Captures.Cast<Capture>().Select(m => m.Value))
        .ToList();

enter image description here