SPARQL 查询中的递归正则表达式以标识匹配的括号



我正在尝试使用 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)
}

最新更新