Regex 使用postgresql中的函数修改反向引用

Regex 使用postgresql中的函数修改反向引用,regex,postgresql,backreference,Regex,Postgresql,Backreference,我想向反向引用添加(int)值 为此,我创建了一个函数并传递了相应的反向引用。如果返回的backreference没有进行任何修改,则可以正常工作,但是当我尝试修改或使用传递的backreference上的任何其他函数时,它假定\3为参数值,而不是backreference值本身 例如- CREATE OR REPLACE FUNCTION add10(text) returns text as $$ DECLARE t int; BEGIN t := to_number(

我想向反向引用添加(int)值

为此,我创建了一个函数并传递了相应的反向引用。如果返回的backreference没有进行任何修改,则可以正常工作,但是当我尝试修改或使用传递的backreference上的任何其他函数时,它假定\3为参数值,而不是backreference值本身

例如-

CREATE OR REPLACE FUNCTION add10(text) returns text as $$
DECLARE
    t int;
BEGIN   
    t := to_number($1, '999999') + 10;
    return trim(to_char(t, '999999'), ' ');
END;
$$ LANGUAGE plpgsql;
然后:

应给出结果

 test
-------
 89018
(1 row)
不管它给--

将$1的值作为1(反向参考编号),而不是值8

知道为什么会发生这种情况吗?

问题:评估顺序 我的猜测(并且只是一个猜测,因为这个问题还不是很清楚)是您对函数调用中参数的求值顺序感到困惑,并且试图在backref值上调用函数,但求值顺序意味着它在regexp求值之前在backref字符串上被调用

假设
add10
t
是同一件事,那么:

select regexp_replace('890808', '80(\d+)', add10('\1'), 'g');
通过首先调用
add10('\1')
来计算。这将反过来运行:

select to_number('\1', '999999') + 10 into t;
由于
select to_number('\1','999999')
生成值
1
,您将在
t
中获得
11
。然后将其转换回字符串(通过一种相当奇怪的方法,为什么不直接将其转换)

因此,您已将
'\1'
替换为
'11'
,因此您的
regexp\u replace
调用如下所示:

select regexp_replace('890808', '80(\d+)', '11`, 'g');
。。。从中你可以看到你意想不到的结果来自哪里

解决方案:拆分值,修改它,然后重新组装它 我认为你想要的结果没有任何意义,所以我真的不知道如何产生它。您似乎试图保留“80”之前的所有数字,放弃“80”,将“80”之后的所有数字转换为数字并添加10,然后将其替换回。这很糟糕,为什么

正则表达式是分割数字的一种方法,但最好的方法通常是模和余数:

craig=> SELECT 890808 / 10000, 890808 % 10000;
 ?column? | ?column? 
----------+----------
       89 |      808
(1 row)

如果您必须使用regexp(例如,如果它是字母数字混合的,或者如果您的条件不容易用位置值表示),那么您可能希望使用
regexp\u split\u to\u array

以及
add10()
函数在哪里输入?+1来理解一些本来没有意义的东西
select regexp_replace('890808', '80(\d+)', '11`, 'g');
craig=> SELECT 890808 / 10000, 890808 % 10000;
 ?column? | ?column? 
----------+----------
       89 |      808
(1 row)