如何在PostgreSQL正则表达式中使用超过9的反向引用?

时间:2014-08-11 20:29:02

标签: regex postgresql

以下正则表达式只是使用反向引用数字提取匹配文本的一部分:

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。

3 个答案:

答案 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