我想使用正则表达式将字符串___abc_[_]xyz
转换为...abc.\_xyz
。
是否可以在同一查询中将_
和[_]
分别转换为.
和\_
?
这是我到目前为止所做的:
SELECT regexp_replace('___abc_[_]xyz','\[(.)\]','\\\1','g');
和
SELECT regexp_replace('___abc_[_]xyz','\[_\]','\_','g');
两个查询的结果为:___abc_\_xyz
答案 0 :(得分:1)
您可以通过三重替换来做到这一点:
SELECT replace(replace(replace('___abc_[_]xyz','[_]','***MYREPLACE***'),'_','.'),'***MYREPLACE***','\_');
您将所有[_]
替换为您的字符串中不存在的特殊字符串
字符串且不包含_
(在我的示例中为***MYREPLACE***
)
您将所有_
替换为.
您将所有***MYREPLACE***
替换为\_
答案 1 :(得分:1)
双重regexp_replace可以完成这项工作:
SELECT regexp_replace(regexp_replace('___abc_[_]xyz','(?!\[)_(?!\])','.','g'),'\[_\]','\\_','g');
regexp_replace
----------------
...abc.\_xyz
(1 row)
第一个使用(?!\[)_(?!\])
的下划线将不在[
和]
之间的下划线替换为一个点。
第二个将[_]
替换为\_