根据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 :(得分:3)
您混淆了与捕获组已捕获的文本相同的模式内联反向引用以及样式为$
+ digit(s)
的替换反向引用。请参阅replace
reference:
在
$replacement
字符串中, 变量$N
可用于引用第N个带括号的子表达式捕获的子字符串在正则表达式中。对于模式的每个匹配,为这些变量分配由相关子表达式匹配的内容的值,然后将修改的替换字符串替换为与模式匹配的$input
中的字符。$0
指的是正则表达式作为整体捕获的子字符串。
现在,只需an example:要复制A(.)B\1
模式,您可以将其替换为$0$0
,AnBn
将变为AnBnAnBn
。这将会发生,因为n
被(.)
捕获并放入第1组缓冲区,而\1
内联反向引用会进一步匹配它。 $0
是对整个匹配的替换反向引用,用于replace
函数的替换模式,替换参数。