4

PostgreSQLregexp_replace関数を使用して、文字列内の角かっこ、括弧、円記号をエスケープして、その文字列を正規表現パターン自体として使用できるようにしています(この文字列を使用する前に他の操作も行われていますが、これらはの範囲外です。この質問。アイデアは置き換えることです:

[\[
]一緒\]
(にと\(
)一緒\)
\\\

正規表現に関するPostgresのドキュメントページには、次のように記載されています。

置換文字列には\nを含めることができます。nは1〜9で、パターンのn番目の括弧で囲まれた部分式に一致するソースサブ文字列を挿入する必要があることを示します。\&を含めると、パターン全体に一致する部分文字列を示すことができます。挿入する必要があります。置換テキストに文字通りの円記号を入れる必要がある場合は、\を記述します。

ただしregexp_replace('abc [def]', '([\[\]\(\)\\])', E'\\\1', 'g');、を生成しabc \ def\ます。

その同じページのさらに下に、\\1表記法を使用する例が示されています-それで私はそれを試しました。

それでも、regexp_replace('abc [def]', '([\[\]\(\)\\])', E'\\\\1', 'g');を生成しabc \1def\1ます。

これは予想されることだと思いますが、regexp_replace('abc [def]', '([\[\]\(\)\\])', E'.\\1', 'g');を生成しabc .[def.]ます。つまり、エスケープは標準の円記号以外の文字で機能します。

この時点で、私はどのように進めるかわかりません。私が欲しい代替品を実際に私に与えるために私は何ができますか?

4

2 に答える 2

5

OK、答えが見つかりました。どうやら、私は交換でバックスラッシュをダブルエスケープする必要があります。また、E古いバージョンのpostgres(私の場合は8.3)では、検索パターンのバックスラッシュをプレフィックスとダブルエスケープする必要があります。最終的なコードは次のようになります。

regexp_replace('abc [def]', E'([\\[\\]\\(\\)\\\\\?\\|_%])', E'\\\\\\1', 'g')

はい、それはひどいように見えますが、それは機能します:)

于 2012-08-23T10:12:30.917 に答える
2

それは最も簡単な方法です

select regexp_replace('abc [def]', '([\[\]\(\)\\])', '\\\1', 'g')
于 2014-01-14T08:41:34.270 に答える