正規表現を必要としない文字列操作を使用して、このようなことを行うことができます。たとえば、「//」の後と「/」の前の文字列形式の URL の一部を取得できます。
select ?url ?hostname {
values ?url { <http://example.org/index.html> }
bind(strbefore(strafter(str(?url),"//"),"/") as ?hostname)
}
---------------------------------------------------
| url | hostname |
===================================================
| <http://example.org/index.html> | "example.org" |
---------------------------------------------------
これは正規表現を使用しないため、正規表現関数を使用したソリューションよりも高速になる可能性があります。
ただし、これはまだホスト名以上のものを取得する可能性があります。たとえば、URL がhttp://username:password@example.org:8080のような場合、 username:password@example.org:8080が取得されます。単なるホスト名ではありません。
これをより慎重に行うには、 RFC 3986などの URI/URL などの仕様の 1 つを選択し、構文コンポーネントに関するセクションを参照してください。その文法からのいくつかの関連する作品は次のとおりです。
URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ]
hier-part = "//" authority path-abempty
/ path-absolute
/ path-rootless
/ path-empty
権限コンポーネントの前には二重スラッシュ (「//」) があり、次のスラッシュ (「/」)、疑問符 (「?」)、番号記号 (「#」) 文字、または末尾で終了します。 URIの。
authority = [ userinfo "@" ] host [ ":" port ]
すべてを処理するわけではありません (複雑なケースを処理するために正規表現を使用する方が理にかなっているかもしれません) が、SPARQL の結果から URI を取得し、実際の URI 解析ライブラリを使用するのが最も簡単かもしれません。ホスト名を取得します。URI は非常に複雑になる可能性があるため、これが最も信頼できるソリューションです。