id="hoge"
やid="fuga"
を、class="hoge"
やclass="fuga"
に置換したい!font-size: rem(20)
やfont-size: rem(32)
を、font-size: min(#{rem(20)},20px)
やfont-size: min(#{rem(32)},32px)
に置換したい!
みたいなことが、1年に一回くらいあってやり方を毎回忘れてしまうので備忘録です!

やり方
※PhpStormの Replace in Filesの場合の説明になりますが、正規表現を使ってディレクトリ内のファイルを横断検索&置換できれば同じ方法が使えるはずです。
(.+) で任意の文字列を捕まえ、置換時は$1で保持する


正規表現を用いた検索をONにした状態で、検索する文字列に(.+)
を使います。
※任意の1文字を1回以上繰り返す、の意味
そのうえで置換する文字列に $1 を入れると、$1の部分には正規表現にかかった文字列が入ります。


正規表現を複数個所使う・エスケープ用の文字を使う


今度は、font-size: rem(20)
を font-size: min(#{rem(20)},20px)
にする方を考えます。
まず、最悪なことに font-size:
の後には半角スペースがあったり、なかったりします。
なので、:の後に(.*)
(任意の文字列が0回以上)を入れて、半角スペースがあっても無くてもヒットするようにします。
次に(20)
が問題です。()
の記号は正規表現では特別な意味を持つため、ただの文字としての()
だと主張するためにエスケープが必要です。
なので \(\)
こんな感じでかっこの前にバックスラッシュを入れます。
そして数値は正規表現で捕まえてきたい値になるので、(.+)
を使って、font-size:(.*)rem\((.+)\)
このようになります。
置換する文字列には$2
を使います。$1
の方には今回の場合は半角スペースが入ったり入らなかったりするからです。
つまり、検索のとき使った「任意の文字列」たちは左から順番に$1、$2に格納されていきます。

今回使いたいのはrem()のかっこの中身なので、$2を使うというわけですね。
まとめ
正規表現を使えば、(.+) で任意の文字列を捕まえ、置換時は$1で捕まえてきた任意の文字列をそのまま利用できます!
エディタの置換機能+正規表現を使いこなして幸せになりましょう!
コメント