PostgreSQL regex_replace

时间:2018-09-04 12:51:58

标签: regex postgresql

我想使用正则表达式将字符串___abc_[_]xyz转换为...abc.\_xyz

是否可以在同一查询中将_[_]分别转换为.\_

这是我到目前为止所做的:

SELECT regexp_replace('___abc_[_]xyz','\[(.)\]','\\\1','g');

SELECT regexp_replace('___abc_[_]xyz','\[_\]','\_','g');

两个查询的结果为:___abc_\_xyz

2 个答案:

答案 0 :(得分:1)

您可以通过三重替换来做到这一点:

SELECT replace(replace(replace('___abc_[_]xyz','[_]','***MYREPLACE***'),'_','.'),'***MYREPLACE***','\_');
  1. 您将所有[_]替换为您的字符串中不存在的特殊字符串 字符串且不包含_(在我的示例中为***MYREPLACE***

  2. 您将所有_替换为.

  3. 您将所有***MYREPLACE***替换为\_

答案 1 :(得分:1)

双重regexp_replace可以完成这项工作:

SELECT regexp_replace(regexp_replace('___abc_[_]xyz','(?!\[)_(?!\])','.','g'),'\[_\]','\\_','g');
 regexp_replace 
----------------
 ...abc.\_xyz
(1 row)

第一个使用(?!\[)_(?!\])的下划线将不在[]之间的下划线替换为一个点。

第二个将[_]替换为\_