お世話になっております。
この度、PostgresSQLの正規表現についてご教授頂きたく質問させてもらいます。
前提・実現したいこと
oracleからpostgresSQLへリプレイス作業を行っています。
検索結果の文字列から、予め指定した3桁の文字を取り除き、新たな文字列として返す処理
を実装しています。
ただし、3桁ごとにグループとなっておりグループをまたぐ場合、対象外とする。
<例>
123---4567---89
↓
1234567---89
正規表現
'^([0-9]{3})?(---)?([0-9]{3})?(---)?'
問合せ文
select REGEXP_REPLACE('---', '^([0-9]{3})?(---)?([0-9]{3})?(---)?' ,'\1\3','g') all_hit , REGEXP_REPLACE('---123', '^([0-9]{3})?(---)?([0-9]{3})?(---)?' ,'\1\3','g') first_hit , REGEXP_REPLACE('123---789', '^([0-9]{3})?(---)?([0-9]{3})?(---)?' ,'\1\3','g') middle_hit , REGEXP_REPLACE('123789---', '^([0-9]{3})?(---)?([0-9]{3})?(---)?' ,'\1\3','g') last_hit , REGEXP_REPLACE('1---56789', '^([0-9]{3})?(---)?([0-9]{3})?(---)?' ,'\1\3','g') part_hit , REGEXP_REPLACE('123---789---456', '^([0-9]{3})?(---)?([0-9]{3})?(---)?' ,'\1\3','g') multi_hit , REGEXP_REPLACE('123456---789---456', '^([0-9]{3})?(---)?([0-9]{3})?(---)?' ,'\1\3','g') multi_hit2
検索結果
all_hit | first_hit | middle_hit | last_hit | part_hit | multi_hit | multi_hit2 | 123 | 123789 | 123789 | 1---56789 | 123789456 | 123456789---456
→ multi_hit2が誤っている。
正しくは、123456789456
すべてのパターンで一致する検索結果が返却される正規表現がわかりません。
どなたか、ご助言頂けましたら幸いです。
よろしくお願い致します。
補足情報(FW/ツールのバージョンなど)
PostgreSQL 12.1