C# 使用正则表达式从SPARQL查询中提取信息

C# 使用正则表达式从SPARQL查询中提取信息,c#,.net,regex,sparql,C#,.net,Regex,Sparql,我很难创建从SPARQL查询中提取名称空间的正则表达式: SELECT * WHERE { ?Vehicle rdf:type umbel-sc:CompactCar ; skos:subject <http://dbpedia.org/resource/Category:Vehicles_with_CVT_transmission>; dbp-prop:assembly ?Place. ?Place geo-on

我很难创建从SPARQL查询中提取名称空间的正则表达式:

SELECT * 
WHERE {
    ?Vehicle rdf:type umbel-sc:CompactCar ;
             skos:subject <http://dbpedia.org/resource/Category:Vehicles_with_CVT_transmission>;
             dbp-prop:assembly ?Place.
    ?Place geo-ont:parentFeature dbpedia:United_States .
}
我需要这样一个表达式:

\\s+([^\\:]*):[^\\s]+

但是上面的方法不起作用,因为它在到达
之前也会占用空格。我做错了什么?

我不知道SPARQL语法的细节,但我可以想象它不是一种正则语言,所以正则表达式无法完美地实现这一点。然而,如果你搜索的东西看起来像一个单词,左边是空格,右边是冒号,那么你可以非常接近它

如果您的输入格式已知且受到足够的限制,此方法可能足以快速解决问题。对于更通用的解决方案,建议您为SPARQL语言寻找或创建合适的解析器

话虽如此,请尝试以下方法:

string s = @"SELECT * 
WHERE {
    ?Vehicle rdf:type umbel-sc:CompactCar ;
    skos:subject <http://dbpedia.org/resource/Category:Vehicles_with_CVT_transmission>;
    dbp-prop:assembly ?Place.
    ?Place geo-ont:parentFeature dbpedia:United_States .
}";

foreach (Match match in Regex.Matches(s, @"\s([\w-]+):"))
{
    Console.WriteLine(match.Groups[1].Value);
}
所以我需要这样一个表达式:

\\s+([^\\:]*):[^\\s]+
Regex.Match(input, @"(?<=\s)([^:]*):[^\s]+")
但上述方法不起作用,因为它在到达“:”之前也会占用空间

正则表达式将占用这些空格,是的,但是括号捕获的组将不包含这些空格。这是个问题吗?您可以通过读取从
Regex.Match
返回的
Match
对象中的
Groups[1]。Value
来访问此组

如果确实需要正则表达式与这些空格不匹配,可以使用所谓的look-behind断言:


(?酷!太快了。谢谢!@Anton Andreev:那么…它能做你想要的吗?你测试过它吗?是的,但我不得不稍微修改一下:@“\s[*([\w-]+):(?!/)”和“[”可能还会有更多类似的情况需要添加。测试需要时间。你可以在我公司的网站上尝试一些SPARQL查询:@Anton Andreev:我刚刚注意到http之前没有空格,所以我添加的特殊情况实际上没有必要。我已经更新了我的帖子以反映这一点。
\\s+([^\\:]*):[^\\s]+
(?<=\s)([^:]*):[^\s]+
Regex.Match(input, @"(?<=\s)([^:]*):[^\s]+")