読者です 読者をやめる 読者になる 読者になる

正規表現の特殊文字のエスケープ関数

あるSQLのプレイスホルダに、正規表現特殊文字を含む文字列を渡した場合などに、特殊文字をエスケープするための関数をつくってみた。

CREATE OR REPLACE FUNCTION
    escape_regexp(text) RETURNS text AS $$
    SELECT
        replace(
        replace(
        replace(
        replace(
        replace(
        replace(
        replace(
        replace(
        replace(
        replace(
        replace(
        replace(
        replace(
        replace($1,
        '\\', '\\\\'),
        '*', '\\*'),
        '+', '\\+'),
        '.', '\\.'),
        '?', '\\?'),
        '{', '\\{'),
        '}', '\\}'),
        '(', '\\('),
        ')', '\\)'),
        '[', '\\['),
        ']', '\\]'),
        '^', '\\^'),
        '$', '\\$'),
        '|', '\\|')
$$ LANGUAGE 'sql';

置換するパターンがみやすいかと、良かれと思って、全部改行入れてみた。

これを使って、

  SELECT * FROM hoge WHERE column1 ~ ('^' || escape_regexp(?) || '-[0-9]{4}$')

見たいな感じで使えないかなぁと。

開発中のAPではいわゆる普通のプレイスホルダじゃなくて、

  SELECT * FROM hoge WHERE column1 ~ ('^' || escape_regexp('#{HOGE_COLUMN_VALUE}') || '-[0-9]{4}$')

みたいな独自予約語の置換方式で実装してるので、S2Daoとかのプレイスホルダでもうまく展開できるか試してない。

#そもそもSQL正規表現を使うのは変態行為なのかしら?