我很难创建一个从此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 .
}
我需要得到:
"rdf", "umbel-sc", "skos", "dbp-prop", "geo-ont", "dbpedia"
我需要一个这样的表达式:
\\s+([^\\:]*):[^\\s]+
但上述方法不起作用,因为它在到达:
之前也会占用空格。我做错了什么?
答案 0 :(得分:0)
我不知道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);
}
结果:
rdf
umbel-sc
skos
dbp-prop
geo-ont
dbpedia
答案 1 :(得分:0)
所以我需要一个这样的表达式:
\\s+([^\\:]*):[^\\s]+
但上述方法不起作用,因为它在到达“:”之前也会占用空格。
正则表达式将占用那些空格,是的,但括号中捕获的组将不包含它。那是问题吗?您可以通过阅读Groups[1].Value
返回的Match
对象中的Regex.Match
来访问此论坛。
如果你真的需要正则表达式不匹配这些空格,你可以使用所谓的后视断言:
(?<=\s)([^:]*):[^\s]+
顺便说一句,你不需要加倍你所有的反斜杠。改为使用逐字字符串,如下所示:
Regex.Match(input, @"(?<=\s)([^:]*):[^\s]+")