正規表現の特殊文字のエスケープ関数
ある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}$')