我输入的字符串如下:
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,以便我可以替换该表中的另一列。
答案 0 :(得分:2)
_.*?_(?=\d+\.)
在您的示例中匹配_abc_
,_xyz-abd_
和_xyz_123_
。这对你有用吗?
DECLARE
result VARCHAR2(255);
BEGIN
result := REGEXP_REPLACE(subject, $$_.*?_(?=\d+\.)$$, $$_foo_$$);
END;
答案 1 :(得分:2)
可能这已经足够了:
_[^.]+_
并替换为
_Replacement_
[^.]+
使用negated character class来匹配至少一个(the +
quantifier)non“的序列。”字符。
我也匹配一个前导和后面的“_”,所以你必须把它放在替换字符串中。
如果PostgreSQL
支持lookbehind and lookahead assertions,则可以避免替换字符串中的“_”:
(?<=_)[^.]+(?=_)
答案 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 [其他标准]