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

したがって、次のような式が必要です。

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

しかし、「:」に到達する前にスペースも消費するため、上記のものは機能しません。

はい、正規表現はそれらのスペースを消費しますが、括弧でキャプチャされたグループにはそれが含まれません。問題ありますか?から返さGroups[1].Valueれたオブジェクトを読み取ることで、このグループにアクセスできます。MatchRegex.Match

これらのスペースに一致しない正規表現が本当に必要な場合は、いわゆる後読みアサーションを使用できます。

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

余談ですが、すべてのバックスラッシュを 2 つにする必要はありません。次のように、代わりにそのままの文字列を使用します。

Regex.Match(input, @"(?<=\s)([^:]*):[^\s]+")
于 2010-08-17T14:11:37.557 に答える
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 に答える