-
\w
単語構成文字[a-zA-Z0-9_]
String#gsub
を使って、不要な文字を空文字に置き換えてしまうのがラクですよね。
\w
と -
以外の文字クラスを用意する
そして文字列から該当文字を排除する。一番単純な発想(というかお題を考えればコレが真っ先に出る)。
phrase.gsub(/[^\w-]/, "")
\W
から -
を除去した文字クラスを用意する
\w
以外の文字全体の文字クラスが \W
([^a-zA-Z0-9_]
)なので、ここから -
を排除した文字クラスを作りたい。
文字クラスの復習
文字クラス
文字クラス(character class) とは角括弧 [ と ] で囲まれ、1個以上の文字を列挙したもので、 いずれかの1文字にマッチします。
:
文字クラス内に別の文字クラスを含めることができます。[a-z[0-9]]
は[a-z0-9]
と同じ意味を持ちます。これだけではあまり意味がありませんが、文字クラスは&&
という、共通部分を取る演算をサポートしているため、これと組合せることで意味を持ちます。文字クラスでは、否定(^
)範囲(-
)共通部分(&&
)列挙(並べる)という演算が可能ですが、これらは-
> (列挙) >&&
>^
という順の結合強度を持ちます。
文字クラス内の3つのメタ文字を通常の文字の意味で使用したい場合には、\
によってエスケープする必要があります。
正規表現|るりま
共通部分を導出
-
\W
から-
を除去する - つまり
-
以外の文字全体([^-]
)と\W
との共通部分(積)を取る - 文字クラス内に文字クラスを組み合わせて
[\W&&[^-]]
phrase.gsub(/[\W&&[^-]]/, "")
あとがき
\W
\S
\D
\H
などの \w
\s
\d
\h
以外の文字全体の文字クラスは個人的にほとんど使いません。
しかしなぜか \W
を使っていた正規表現を元にして変更するときに &&
を使ったのでメモ書きしました。
でも、大元に立ち返って \w
から考え直した方が楽そうです。