実践 Atomと正規表現で検索置換してみた2


人からもらったCSVのデータを整形してRubyのハッシュや配列
にするのに、まだウロ覚えの正規表現を使ってみた。
Part1では必要となる正規表現のおさらいを行ったので、
当ページではAtomでの実際の検索置換をPart2として行ってみる。
なお、あくまで正規表現の練習なので、最短のやり方 では ない かもしれませんが、ご容赦下さい。

元のデータ

Tokyo,130,,
Kanagawa,110,,
Saitama,105,,
Chiba,108,,

最終形態

この状態にしたい。

{ Tokyo: 130, Kanagawa: 110, Saitama: 105, Chiba: 108 }

Step1 カンマを除去

これは素直に以下の様にしてReplace AllすればOK。

Steap2 Atomで正規表現モードにする

検索置換 メニューで検索置換機能を呼び出し、以下の画像の * の部分(青と白で反転している部分)をクリックして正規表現オプションをONにする。

Step3 文字列の後ろにセミコロンと半角スペースを加える

Before

Tokyo130
Kanagawa110
Saitama105
Chiba108

After

Tokyo: 130
Kanagawa: 110
Saitama: 105
Chiba: 108

正規表現の書き方

まず[a-z]英字を抽出するが、これだけだと英字が1つ1つ別に抽出されてしまう。そこで[a-z]+とする。これは+1回以上の繰り返しのうち最長を意味するからである。

置換のやり方

正規表現としては[a-z]+でOKだが、実際に行いたいのは抽出である。まずは、AtomoのFind in a current bufferとなっている入力欄に抽出の正規表現を入力したら全体をカッコで囲む、その結果、上記の画像の様に([a-z]+)になる。

続いて、抽出後にどうしたいかを入力する。AtomのReplace in current bufferの入力欄に、まず$1と入力する。この$1はカッコで囲った正規表現の部分に対応している。なお、今回は一箇所しかないので$1となっているが、複数の場合は$1 $2・・・となる。

抽出した部分の後にコロンと半角スペースを付け足すので、最終的には$1:として(半角スペースと分かりくいけど)Replaceボタンをクリックする。実行前に抽出箇所を確認したい場合はFind allをクリックすればよい。

step4 行末にカンマと半角スペースを追加

これは以下でよし(半角スペースが見えないけど)。

After

Tokyo: 130,
Kanagawa: 110,
Saitama: 105,
Chiba: 108,

step5 改行を除去

改行は\nなので以下の様になる。

after

Tokyo: 130, Kanagawa: 110, Saitama: 105, Chiba: 108,

step6 最後は手作業

ハッシュの開始や閉じは1つだけなので手作業で入力し、また最後のカンマも削除して以下の様になり終了。

{ Tokyo: 130, Kanagawa: 110, Saitama: 105, Chiba: 108 }

参考

初心者歓迎!手と目で覚える正規表現入門・その1「さまざまな形式の電話番号を検索しよう」

初心者歓迎!手と目で覚える正規表現入門・その2「微妙な違いを許容しつつ置換しよう」

Ruby 正規表現のまとめ