当前位置: 首页 > 知识库问答 >
问题:

SPARQL查询中用于识别匹配括号的递归正则表达式

王飞英
2023-03-14

我试图使用SPARQL来查询带有平衡括号的正则表达式的文字。所以“(1) ((2)) (((3))) 4)”应该返回,但是“(1) ((2)) (((3)) 4)”不应该返回,我在“3”后面删除了一个结束括号。

我之前在这里寻找了一个合适的正则表达式:正则表达式来匹配平衡括号

并且一直在尝试实现rogal111建议的正则表达式,如下所示:

\(([^()]|(?R))*\)

这个正则表达式遵循PCRE语法,据我所知,这是W3C标准,应该遵循SPARQL。根据链接的例子http://regex101.com/r/lF0fI1/1这应该适用于上述示例。

我已经在一家基于杰纳的三联书店和一家基于大师的三联书店上测试了这一点。

Jena:当我尝试用下面的查询为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))*\\)").
}

我不确定这是故意的,一个bug,还是我做错了什么。最终我想让它在基于Jena的triplestore上工作。有人能帮我吗?

共有1个答案

冯流觞
2023-03-14

为了澄清和补充我对使用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)
}
 类似资料:
  • 我有一些以下模式的文本字符串。 > 此外,我还想捕获之后第一个

  • 问题内容: 匹配字符串中的’(’的正则表达式是什么? 以下是场景: 我有一串 我想使用正则表达式拆分字符串。为此,我正在使用 但是我收到以下异常。 转义似乎不起作用。 问题答案: 两种选择: 首先,你可以使用转义 回 斜线- 另外,由于它是单个字符,因此您可以将其放入不需要转义的字符类中-

  • 我有一个这样的字符串: 我需要处理这样上面的代码就变成了 我需要一直这样做直到我 我的模式字符串将匹配整个内容。不是。 Java代码:

  • 问题内容: 我有类似的东西 商店 结束行像1商店..我想匹配,它使用python正则表达式。 我尝试了类似的方法, 但是没有用。 编辑:添加代码,我试过 请帮助。 谢谢吉乔 问题答案: 或多或少直接回复您的评论 尝试这个 解决方案是使用,而不是使用后者,因为后者试图将整个字符串与regexp匹配,而前者只是试图在字符串内部查找与表达式匹配的子字符串。

  • 问题内容: 我正在尝试编写一个匹配嵌套括号的正则表达式,例如: 这样的字符串应该匹配,导致所有嵌套括号都被关闭,而是: 不应该或更好地至少匹配第一个“(((text)))(text)”部分。 实际上,我的正则表达式是: 但这并不能像我期望的那样正常工作。如何解决?我哪里错了?谢谢! 问题答案: 当我找到此答案时,我无法弄清楚如何修改模式以使用自己的定界符where 和。所以我的方法是使其更通用。

  • 本文向大家介绍python正则表达式中的括号匹配问题,包括了python正则表达式中的括号匹配问题的使用技巧和注意事项,需要的朋友参考一下 问题: m = re.findall('[0-9]*4[0-9]*', '[4]') 可以匹配到4. m = re.findall('([0-9])*4([0-9])*', '[4]') 匹配不到4. 这是为什么呢?PS,这个是一个简化的说明,我要用的正则比这