4

postgreSQLでregex_replaceを使用していて、文字または数字ではない文字列内の文字を削除しようとしています。ただし、この正規表現を使用する場合:

select * from regexp_replace('blink-182', '[^a-zA-Z0-9]*$', '')

'blink-182'を返します。私が期待するように、ハイフンは削除されず、何も('')に置き換えられていません。

この正規表現を変更してハイフンも置き換えるにはどうすればよいですか?他の多くの文字(!、。#)でテストしましたが、すべて正しく置き換えられています。

何か案は?

4

1 に答える 1

12

現在、文字列の末尾にある一連の英数字以外の文字のみを置き換えます。foobar!#あなたのテストは主に、削除する文字が文字列の最後にあるために機能する形式の文字列だったと思います。

文字列内のそのような文字の出現をすべて置き換えるには$、正規表現から を削除します。

[^a-zA-Z0-9]+

(また、すべての文字間で長さがゼロになる置換を防ぐために、*を aに変更しました。+

空白も保持したい場合は、文字クラスに追加する必要があります。

[^a-zA-Z0-9 ]+

またはおそらく

[^a-zA-Z0-9\s]+

文字列の末尾から英数字以外の文字のみを削除したいが、文字列の途中にあるハイフンマイナス削除したいという点で、最初の正規表現が実際には正しかった場合(他の非英数字を保持しながら)文字列の途中で)、次のように動作するはずです。

[^a-zA-Z0-9]+$|-

maniekregexp_replaceは、引数を追加して、複数回の一致を置き換える必要があると指摘しています。

regexp_replace('blink-182', '[^a-zA-Z0-9]+$|-', '', 'g')
于 2012-04-16T14:02:44.320 に答える