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

hotoolong's blog

Railsやvimや気になったことを綴ってます

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