1

PostgreSQL (9.2) で次の regex_replace ステートメントを試しています

 # SELECT regexp_replace('_this._is_a_long_entry._of.nonsense_text', '\._|^_', '$','g');

目的:

ピリオドの前にあるすべてのアンダースコア文字を「$」に​​置き換えます。位置1に固定されたアンダースコアも置き換えています。これは機能しています。両方の試合を 1 つのステートメントに詰め込みたいと思います。これはすべて、私たちが持っているいくつかの奇妙なテキストを PostreSQL ltree 構造にプッシュするためのメカニズムを開発することです。

問題:

ピリオドの文字を傷つけることなく、上記の最初の置換を機能させるにはどうすればよいですか?

結果が次のようになることを確認したいと思います。

$this.$is_a_long_entry.$of.nonsense_text

注: アンダースコアの明示的なキャプチャも試みましたが、PG の実装はこれを無視しているようです:

# SELECT regexp_replace('_this.is_long_entry._of.nonsense_text', '\.(_)|^_', '$','g');
4

1 に答える 1

2
SELECT regexp_replace('_this._is_a_long_entry._of.nonsense_text'
                     ,'(\.|^)_' -- capture the preceding char (none at start)
                     , '\1$'    -- use the captured char
                     ,'g');     -- globally

これは を想定してstandard_conforming_strings = ONいます。

于 2012-09-26T19:59:55.983 に答える