Rubyで複数選択で装飾文字を削除するとかなったときにちょっと困ったのでメモ
目的
-
?
とか.
とかを正規表現でマッチしたい - 顔文字とかも正規表現でマッチしたい
事前知識
例えば、#gsub
を使って、「?」を「!」に変えたいというときは
string = 'Hello World?'
string.gsub(/?/,'!') #=> エラーが出る
なんてことはできなくて、
string = 'Hello World?'
string.gsub(/\?/,'!') #=> 'Hello World!'
というように\
でエスケープする必要がある。
エスケープしなければいけない文字列一覧は以下の通り(Macの場合)
\ * + . ? { } ( ) [ ] ^ $ - | /
(ちなみに、Windowsの場合は\
→¥
です)
本題
ただ、実は複数選択でマッチしたいときにはそんなにエスケープする必要がない
例えば、「?」と「.」を全部「!」に変えたいとかなら
string = 'Hello World? Hello World.'
string.gsub(/[?.]/,'!') #=> 'Hello World! Hello World!'
とすると、エラーが出ない!
ただし、「-」に関しては範囲指定の役割があるので
string = 'Hello-World? Hello-World.'
string.gsub(/[?-.]/,'!') #=> エラーが出る
当たり前ですね。
マッチさせたいのであれば、
string = 'Hello-World? Hello-World.'
string.gsub(/[?\-.]/,'!') #=> 'Hello!World! Hello!World!'
のようにエスケープすることでマッチする。
これは複数選択の時のみ注意すべきなので、[]
を使わない場合は-
はエスケープしなくても大丈夫です。
追記
ハイフンを含めたい場合、 /[?-.]/ ではなく /[?.-]/ や /[-?.]/ にすれば問題ないですよ。
と @riocampos さんからコメントいただきました!
要は、文字の間に入れるとダメみたいですね。
ありがとうございます!