正则表达式 - 重复捕获

时间:2016-07-18 20:12:51

标签: c# regex

我有一个像:

这样的片段
<meta property="size" content="38R|38L|44R|36R|44L|42R|42L|40S|40R|40L|38S" />

我希望返回:38R38L44R ...作为单独的匹配/捕获

我有点卡住了 - 我已经尝试了十亿件事情,但感觉到了一个重复的&#39; +&#39;家伙可能就是答案:

<meta property="size" content="((.*?)\|)+

最值得赞赏的任何帮助。

提取值的coide如下所示:

var values = match
    .Cast<Match>()
    .Select(m => m.Groups[1].Value)
    .ToList();

我无法改变它 - 在这种情况下必须使用正则表达式。

来自Wiktor的这个正则表达式完成了这个伎俩!

 (?:<meta\s+property="size"\s+content="|(?!^)\G\|?)(\w+)

1 个答案:

答案 0 :(得分:2)

你真的可以在没有正则表达式的情况下获得值。添加System.Xml.Linq命名空间,您可以解析字符串的内容,如下所示:

var input = "<meta property=\"size\" content=\"38R|38L|44R|36R|44L|42R|42L|40S|40R|40L|38S\" />";
var xml = XElement.Parse(string.Format("<root>{0}</root>", input));
var content = xml.Elements("meta")
        .Select(c => c.Attribute("content").Value).FirstOrDefault();
var res = content.Split('|');

enter image description here

如果 - 任何机会 - 该解决方案对您不起作用,可以使用后备正则表达式解决方案

var input = "<meta property=\"size\" content=\"38R|38L|44R|36R|44L|42R|42L|40S|40R|40L|38S\" />";
var result = Regex.Matches(input, @"(?:<meta\s+property=""size""\s+content=""|(?!^)\G\|?)(\w+)")
    .Cast<Match>()
    .Select(p => p.Groups[1].Value)
    .ToList();
foreach (var s in result)
    Console.WriteLine(s);

请参阅IDEONE demo

请注意\w+(1个或多个字词字符)可以替换为[^|"]+