需要为regexp_replace形成模式

时间:2014-02-21 07:02:46

标签: regex postgresql

我输入的字符串如下:

1.2.3.4_abc_4.2.1.44_1.3.4.23
100.11.11.22_xyz-abd_10.2.1.2_12.2.3.4
100.11.11.22_xyz_123_10.2.1.2_1.2.3.4

我必须替换由_分隔的两个ipaddress之间形成的第一个字符串,但是在某些字符串中_是替换字符串的一部分(xyz_123

我必须从上面的字符串中找到abc,xyz-abd和xyz_123,以便我可以替换该表中的另一列。

3 个答案:

答案 0 :(得分:2)

_.*?_(?=\d+\.)

在您的示例中匹配_abc__xyz-abd__xyz_123_。这对你有用吗?

DECLARE
    result VARCHAR2(255);
BEGIN
    result := REGEXP_REPLACE(subject, $$_.*?_(?=\d+\.)$$, $$_foo_$$);
END;

答案 1 :(得分:2)

可能这已经足够了:

_[^.]+_

并替换为

_Replacement_

here on Regexr

[^.]+使用negated character class来匹配至少一个(the + quantifier)non“的序列。”字符。

我也匹配一个前导和后面的“_”,所以你必须把它放在替换字符串中。

如果PostgreSQL支持lookbehind and lookahead assertions,则可以避免替换字符串中的“_”

(?<=_)[^.]+(?=_)

See it on Regexr

答案 2 :(得分:0)

为了映射匹配前两个“”,正如@stema和@Tim Pietzcker提到的正则表达式一样。然后为了将“”附加到列,这是我正在努力的,可以使用||运营商如下面

更新table1 set column1 = regexp_replace(column1,'。*?(?= \ d +。)',''|| column2 ||'_')

然后,为了使用另一个表进行更新查询,以下内容可以是有帮助的

更新table1为t set column1 = regexp_replace(column1,'。*?(?= \ d +。)',''|| column2 ||'_')from table2 as t2 where t.id = t2.id [其他标准]