hotoolong's blog

プログラムのことやエンジニアリングに関することを記事にしています。

MySQLで正規表現を使って制御文字を抽出

Oracleでは使えなかった正規表現MySQLで使える!!とおもったらOracleも10gから使えてました。
SQLクリニック(1):Oracle 10gの正規表現で文字列操作を極める (1/2) - @IT

携帯からユーザ登録などすると意図せずに改行コードなどの制御文字が登録されてたりします。
登録時にチェックして弾けばいいんでしょうが、既にサービスが開始されててチェックしてなかった〜というアホなサービスでは、後から置き換えたりしないとほほ。。
ということで、ユーザ名に制御文字列が含まれてないかMySQLでは検索時に抽出できるんです!賢い。

-- sample select
SELECT * FROM users WHERE BINARY name REGEXP '[:cntrl:]' ;

文字列の後ろにスペース、改行コードがあるユーザ名を検索したい場合などは

-- sample select
SELECT * FROM users WHERE BINARY name REGEXP '[\r\n ]+$' ;

[:spece:]でもいいかも知れません。

POSIXが使えるのはいいですね〜
POSIXもいろいろ種類があるので調べてみるといいかも知れません。
RubyでもPOSIXが利用出来るので、取得したnameのデータをgsubすると綺麗に変換できたりします。
否定(でない)も簡単に書けます。

サンプルとして、先頭は空白以外?ってのも簡単に書けます。

# sample
>> name = 'hotoolong'
=> "hotoolong"
>> /^[^[:blank:]]+/ =~ name
=> 0

ここは\sでもいいかも知れないですが、、

# sample
>> /^[^\s]+/ =~ name
=> 0

美しい。かなり使えそうです。


http://dev.mysql.com/doc/refman/5.1-olh/ja/regexp.html
Ruby Reference Manual