Regex 使用postgresql中的函数修改反向引用
我想向反向引用添加(int)值 为此,我创建了一个函数并传递了相应的反向引用。如果返回的backreference没有进行任何修改,则可以正常工作,但是当我尝试修改或使用传递的backreference上的任何其他函数时,它假定\3为参数值,而不是backreference值本身 例如-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(
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)