1

我很难创建一个从这个 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]+

但是上面的那个不起作用,因为它在到达之前也会吃掉空格:。我究竟做错了什么?

4

2 回答 2

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
于 2010-08-17T13:42:54.793 回答
0

所以我需要这样的表达:

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

但是上面的那个不起作用,因为它在到达“:”之前也会吃掉空格。

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

如果您确实需要正则表达式与这些空格匹配,则可以使用所谓的后视断言

(?<=\s)([^:]*):[^\s]+

顺便说一句,您不需要将所有反斜杠加倍。请改用逐字字符串,如下所示:

Regex.Match(input, @"(?<=\s)([^:]*):[^\s]+")
于 2010-08-17T14:11:37.557 回答