假设有一个像这样的字符串:
string txt = "Lore ipsum {{abc|prop1=\"asd\";prop2=\"bcd\";}} asd lore ipsum";
我要提取的信息“abc”和对象(“prop1”,“asd”),(“prop3”,“bcd”),每对使用一个;作为界限。
编辑1 :(基于MikeB的)代码
啊,越来越近了。我发现了如何解析以下内容:
string txt = "Lore ipsum {{abc|prop1=\"asd\";prop2=\"http:///www.foo.com?foo=asd\";prop3=\"asd\";prop4=\"asd\";prop5=\"asd\";prop6=\"asd\";}} asd";
Regex r = new Regex("{{(?<single>([a-z0-9]*))\\|((?<pair>([a-z0-9]*=\"[a-z0-9.:/?=]*\";))*)}}", RegexOptions.Singleline | RegexOptions.IgnoreCase);
Match m = r.Match(txt);
if (m.Success)
{
Console.WriteLine(m.Groups["single"].Value);
foreach (Capture cap in m.Groups["pair"].Captures)
{
Console.WriteLine(cap.Value);
}
}
问题1:我该如何调整正则表达式来说'仅由一个分隔的对中的每个值?'我添加了像'。',';'这样的字符等,但我想不出我想要允许的任何字符。反过来会更好。
问题2 :我如何在这里调整这个正则表达式的工作?
string txt = "Lore ipsum {{abc|prop1=\"asd\";prop2=\"http:///www.foo.com?foo=asd\";prop3=\"asd\";prop4=\"asd\";prop5=\"asd\";prop6=\"asd\";}} asd lore ipsum {{aabc|prop1=\"asd\";prop2=\"http:///www.foo.com?foo=asd\";prop3=\"asd\";prop4=\"asd\";prop5=\"asd\";prop6=\"asd\";}}";
因此,我可能会尝试获取{{...}}组并使用其他正则表达式?
答案 0 :(得分:2)
我对你如何过滤做了一些假设,但我认为这个想法几乎存在。每对都被放入配对组的捕获集合中,你可以拥有任意数量的对。
string txt = "Lore ipsum {{abc|prop1=\"asd\";prop2=\"bcd\";prop3=\"bbb\";}} asd lore ipsum";
Regex r = new Regex("{{(?<single>([a-z0-9]*))\\|((?<pair>((?<key>([a-z0-9]*))=\"(?<value>([a-z0-9]*))\";))*)}}", RegexOptions.Singleline | RegexOptions.IgnoreCase);
Match m = r.Match(txt);
if (m.Success)
{
Console.WriteLine(m.Groups["single"].Value);
foreach (Capture cap in m.Groups["pair"].Captures)
{
Console.WriteLine(cap.Value);
}
foreach (Capture cap in m.Groups["key"].Captures)
{
Console.WriteLine(cap.Value);
}
foreach (Capture cap in m.Groups["value"].Captures)
{
Console.WriteLine(cap.Value);
}
}