您可以使用不需要正则表达式的字符串操作来执行此类操作。例如,您可以在“//”之后和“/”之前获取 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,其中不仅仅是主机名。
要更仔细地执行此操作,您需要选择 URI/URL 等规范之一,例如RFC 3986,并查看有关语法组件的部分。该语法的一些相关产生是:
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 可能非常复杂。