【问题标题】:SPARQL REPLACE back-reference syntax $ or backslash?SPARQL REPLACE 反向引用语法 $ 或反斜杠?
【发布时间】:2017-05-15 10:18:03
【问题描述】:

根据SPARQL 1.1 W3C Recommendation,正则表达式使用XQuery 1.0 and XPath 2.0 Regular Expression Syntax,它用反斜杠定义反向引用:

[9a] backReference ::= "\" [1-9][0-9]*

但是在DBpedia Virtuoso 07.20.3218 SPARQL Endpoint 上使用此语法会导致错误:

select replace(str(?class),"A.","\0\0") { ?class a owl:Class. }

Virtuoso 37000 Error SP030: SPARQL compiler, line 0: Bad escape sequence in a short double-quoted string at '"\'

但是使用$ 可以:

select replace(str(?class),"A.","$0$0") { ?class a owl:Class. }

这是建议中的疏忽、Virtuoso 端点中的非标准语法还是我误解了建议?

【问题讨论】:

  • 在我看来,您在这里将内联反向引用与替换反向引用混淆了。
  • 如果我双重转义,那么我只是将数字本身作为输出,例如"\\0" 返回 "0"。
  • 是的,当然,那条评论不正确。我已将其删除。替换反向引用语法是$ + 捕获组的 ID。

标签: regex sparql


【解决方案1】:

您混淆了模式内联反向引用,这些反向引用匹配与捕获组已捕获的相同文本和样式为$+digit(s)替换反向引用。见replace reference

$replacement字符串中,一个变量$N可以用来引用正则表达式中第N个带括号的子表达式捕获的子字符串.对于模式的每次匹配,这些变量都被分配了相关子表达式匹配的内容的值,然后将修改后的替换字符串替换为$input 中与模式匹配的字符。 $0指的是整个正则表达式捕获的子串。

现在,只需an example:要复制A(.)B\1 模式,您可以将其替换为$0$0,然后AnBn 将变为AnBnAnBn。这会发生,因为n(.) 捕获并放入第1 组缓冲区,并且\1 内联反向引用进一步匹配它。 $0 是对整个匹配的替换反向引用,用于替换模式,replace 函数的替换参数。

【讨论】:

  • 谢谢!我混淆了这两者,因为我什至不知道存在模式内联反向引用。
猜你喜欢
  • 1970-01-01
  • 2015-05-19
  • 2011-03-02
  • 1970-01-01
  • 1970-01-01
  • 2012-06-16
  • 1970-01-01
  • 2013-07-23
  • 2010-12-14
相关资源
最近更新 更多