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

6
以下正则表达式仅使用反向引用数字来提取匹配文本的一部分:
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。

不,它只是简单地返回\g<10>。 - Sébastien Clément
搜索有关PostgreSQL的内容。我知道这只是一个例子,但实际上,您只需要一个捕获组。 - user557597
2
根据文档所述,您可以使用\n,其中n为1-9,或\&来包含整个匹配。因此,它不受支持。但是,您可以尝试使用regexp_split_to_array()regexp_split_to_table()编写更复杂的查询。 - Sam
嘿,当你把\111作为替换时会发生什么? - user557597
那么,如何插入一个字符的八进制代码呢?不能进行插值吗?哦,这可能是另一种类型的转义。 - user557597
显示剩余2条评论
3个回答

2

正如我在评论和@p.s.w.g的答案中所说,根据文档,这是不可能的。

然而,还有一些其他的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
根据文档,模式字符串中支持大于9的反向引用:
\mnn(其中m是非零数字,nn是更多数字,且十进制值mnn不大于目前为止看到的关闭捕获括号数)是对第mnn个子表达式的反向引用
然而,在regexp_replace中,似乎不支持替换字符串中的大于9的反向引用:
替换字符串可以包含\ n,其中n是1到9,表示应插入与模式的第n个括号化子表达式匹配的源子字符串...

0

我通常更喜欢regexp_matches(...)方法,这是@Sam提到的,但我在这里创建了一个不错的regexp_replace2(...)纯SQL包装函数,支持大于9的反向引用:postgres-utils


1
您的链接显示“未找到存储库”=>您还在其他地方有这个可用的吗? - Simon Kissane

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接