我有一个像:
这样的片段<meta property="size" content="38R|38L|44R|36R|44L|42R|42L|40S|40R|40L|38S" />
我希望返回:38R
,38L
,44R
...作为单独的匹配/捕获
我有点卡住了 - 我已经尝试了十亿件事情,但感觉到了一个重复的&#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+)
答案 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('|');
如果 - 任何机会 - 该解决方案对您不起作用,可以使用后备正则表达式解决方案
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个或多个字词字符)可以替换为[^|"]+
。