我正在尝试使用 SPARQL 来查询具有带平衡括号的正则表达式的文本。 所以
"(1(((2((((3(((4("应该返回,但"(1(((2((((3((4(",我删除了"3"后面的右括号,不应该返回。我之前在这里寻找过合适的正则表达式:正则表达式以匹配平衡括号
并且一直在尝试实现rogal111建议的正则表达式,如下所示:
(([^()]|(?R))*)
这个正则表达式遵循 PCRE 语法,据我所知,这是 W3C 标准,应该遵循 SPARQL。 根据链接的示例 http://regex101.com/r/lF0fI1/1 这应该适用于上面的示例。
我已经在耶拿的三重商店和Virtuoso的三重商店上对此进行了测试。
耶拿:当我尝试使用以下查询为 SPARQL 实现它时,它说 (?R( 内联修饰符未知。
SELECT ?lf
WHERE
{
BIND("(test)" AS ?l)
FILTER REGEX(?l, "\(([^()]|(?R))*\)").
}
返回的完整错误消息如下所示。
Regex pattern exception: java.util.regex.PatternSyntaxException: Unknown inline modifier near index 11 (([^()]|(?R))*)
Virtuoso:基于Virtuoso的三重存储(测试对象:https://sparql.uniprot.org/sparql(确实有效,但也返回不正确的输出,如以下查询所示:
SELECT ?lf
WHERE
{
BIND("((test)" AS ?l)
FILTER REGEX(?l, "\(([^()]|(?R))*\)").
}
我不确定这是故意的、错误的还是我做错了什么。最终,我想让它在耶拿的三重商店工作。谁能帮我解决这个问题?
只是为了澄清和补充我对使用REPLACE
的评论,以下内容应该有效:
SELECT *
{
VALUES ?value {
"( (1) ((2)) (((3))) 4)"
"( (1) ((2)) (((3)) 4)"
"before (test) after"
"before ((test) after"
}
bind(!regex(
replace(?value, '(?=\()(?:(?=.*?\((?!.*?\1)(.*\)(?!.*\2).*))(?=.*?\)(?!.*?\2)(.*)).)+?.*?(?=\1)[^(]*(?=\2$)', '')
, '[()]') as ?result)
}