-
をエスケープする必要はありません 最初または最後の位置に配置すると、文字クラス内に配置されます。これは、そのように範囲として誤読される可能性がないためです。
[\- ]
-> [- ]
[\d\- ]
-> [\d -]
あなたがそれを持っている方法は上限10
最後に無駄です。$
を追加します 最後に末尾の文字を禁止します。
または\D
末尾の数字を禁止する (ただし、数字以外が必要です)。
または($|\D)
文字列をそこで終了するか、数字以外のフォローを付けます。
まとめる:
SELECT '+79637434199' ~ '^(8|\+7)[ -]?(\(?\d{3}\)?[ -]?)[\d -]{7,10}($|\D)'
それ以外の場合、式は問題なく、PostgreSQL9.1.4で機能します。 WHERE
で使用するかどうかに関係なく、何の違いもありません。 句またはSELECT
リスト-古いバージョン(コメントで提案されている@kgrittnなど)でバグが発生している場合を除きます。
文字列リテラルの前にE
を付けると 、私はあなたが得るエラーメッセージを引き起こすことができます。これはできません 式はSELECT
として正常に機能すると述べたため、問題を説明してください アイテム。
しかし、シャーロック・ホームズが引用しているように、「不可能を排除したとき、残っているものは、どんなにありそうもないとしても、真実でなければなりません。」
standard_conforming_strings = on
もう1つはstandard_conforming_strings = off
です。 -これは、9.1より前の古いバージョンの文字列リテラルのデフォルトの解釈でした。たぶん、2つの異なるクライアント(それに関して異なる設定を持っている)で。
詳細については、文字列定数の章を参照してください。 Cスタイルのエスケープ付き マニュアルで。