以下正则表达式只是使用反向引用数字提取匹配文本的一部分:
SELECT regexp_replace('ABCDEFGHIJ','(\w)(\w)(\w)(\w)(\w)(\w)(\w)(\w)(\w)(\w)','\2');
B
但是如何在第九个匹配的子串之外进行反向引用?
以下不起作用(返回第一场比赛+ 0),也不会使用$ 10或$ {10}:
SELECT regexp_replace('ABCDEFGHIJ','(\w)(\w)(\w)(\w)(\w)(\w)(\w)(\w)(\w)(\w)','\10')
A0
注意:为简洁起见,此示例已经过简化,当然不需要超出反向引用9。
答案 0 :(得分:2)
正如我在评论和@ p.s.w.g的回答中所说,根据the documentation,这是不可能的。
但是,还有一些其他RegEx功能可能会有所帮助。如果你可以用现实问题更新你的问题,我可以更具体地帮助你。但是这是一个使用regexp_matches()
解决您的初始问题的示例。
SELECT matches[10]
FROM regexp_matches('ABCDEFGHIJ', '(\w)(\w)(\w)(\w)(\w)(\w)(\w)(\w)(\w)(\w)') AS matches;
matches
---------
J
(1 row)
答案 1 :(得分:1)
根据documentation,模式字符串中支持大于9的后向引用:
的后向引用
\mnn
(其中m
是非零数字,nn
是更多数字,小数值mnn
不大于关闭捕获括号的数量到目前为止看到的mnn
'子表达式
但是,regexp_replace
中的replacement strings似乎不支持
replacement
字符串可以包含\n
,其中n
是1到9,表示源子字符串与n
括号内的子表达式匹配应该插入模式......
答案 2 :(得分:0)
我更喜欢 @Sam 一般提到的 regexp_matches(...)
方法,但已创建一个不错的 regexp_replace2(...)
,纯sql,包装函数支持反向引用> 9 :postgres-utils