根据SPARQL 1.1 W3C建议,正则表达式使用XQuery 1.0和XPath 2.0正则表达式语法,该语法定义了带有反斜杠的反向引用:
[9a] backReference ::= "" [1-9][0-9]*
但是,在 DBpedia Virtuoso 07.20.3218 SPARQL 端点上使用此语法会导致错误:
select replace(str(?class),"A."," ") { ?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端点中的非标准语法,还是我误解了建议?
您混淆了与捕获组已捕获的相同文本匹配的模式内联反向引用和样式为$
+digit(s)
的替换反向引用。请参阅replace
参考:
在
$replacement
字符串中,变量 $N
可用于引用正则表达式中第 N 个括号子表达式捕获的子字符串。对于模式的每个匹配项,将为这些变量分配相关子表达式匹配的内容值,然后将修改后的替换字符串替换为与模式匹配的$input
字符。$0
是指正则表达式作为一个整体捕获的子字符串。
现在,仅举一个例子:要复制A(.)B1
模式,您可以将其替换为$0$0
,AnBn
将变成AnBnAnBn
。发生这种情况是因为n
是用(.)
捕获并放入组 1 缓冲区1
并且内联反向引用进一步匹配它。$0
是对整个匹配的替换反向引用,用于替换模式,替换参数以replace
函数。