任何人都可以用正则表达式帮我解决这个问题:
[x: {aaa}] blablabla [x: {bbb}, {ccc}] blablabla [y: {ddd}]
必需: aaa bbb ccc
即。查找[x: ]
然后用大括号括起来 - 忽略[y: ]
甚至可能吗?
答案 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
如果数据格式不正确,则最好使用正则表达式。这是你可以使用的一个:
@"\[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();