2015-06-11

エンジニア研修 第4日目 (正規表現)

こんにちは、新卒の縄田です。

エンジニア研修も第4日目に入り、非エンジニアの新卒も、黒い画面を見ることに慣れてきました。

研修を始める前は、「エンジニアさんは暗号のような文字と黒い画面を見ながら、ッッターンとキーボードを叩き、何をされているのかな…?」と思っていましたが、研修を経てエンジニアさんが何をしているのか理解することができました。


今ならこの質問に私が答えられます。

ちなみに、エンジニアさんになぜ画面が黒いのか聞いたところ、黒い方が目が疲れないからだそうです。
確かに黒い画面は目が疲れませんね。

さて、今回の研修では、正規表現について勉強しました。

正規表現とは、
文字列の集合を1つの文字列で表現する方法の一つのことで、文字列を検索(match)したり置換(replace)したりするときに使われます。

例えば、

「Windowsで…あ、WINDOWSかもしれないんだけど…次にスペースが入ったり入ってなかったりして…そのあとにやっぱり98が付いてー…あーでも95が付いてもよくてー…うん、そんな感じのやつ教えて!」

のようななんとも分かりづらい要望も、正規表現であれば、コンパクトに検索したり置換したりすることができます。
つまり、正規表現を使うことで、単純な文字列検索ではできない検索や置換を行うことができます。

正規表現で使う文字は、メタ文字といい、特殊な意味を持っています。

メタ文字は以下のものがあります。
. * + [ ] ( ) \ | ? ^ $

それぞれの意味と使用例は、

.(ドット)
意味:任意の一文字
例:スペースに囲まれた何か2文字がある行を検索せよ!
$ egrep '\s..\s' data.txt

*(アスタリスク)
意味:0回以上の繰り返し
例:aを0回以上繰り返ししている行を検索せよ!
Ja*m

+(プラス)
意味:1回以上の繰り返し
例:aを1回以上繰り返ししている行を検索せよ!
Ja+m

[](角括弧)
意味:どれか1文字を表す
例:YuさんかWuさんの行を検索せよ!
$ egrep '\s[YW]u\s' data.txt

()(括弧)
意味:グループ化
例:McDaniel さんか McLane さんを検索せよ!
$ egrep '\sMc(Daniel|Lane)\s' data.txt

|(バーティカルバー)
意味:どれかにマッチする
例:JerryさんかBobbyさんかAlanさんのどれかが存在する行を検索せよ!
$ egrep '\sJerry\s|\sBobby\s|\sAlan\s' data.txt

?(クエスチョン)
意味:直前の文字があってもなくてもいい場合
例:MichelさんかMichelaさんかどちらかの行を検索せよ!
$ egrep '\sMichaela?\s' data.txt

^(ハット)
意味:行頭
例:128から始まる行を検索せよ!
$ egrep '^128' data.txt

$(ドル)
意味:行末
例:5で終わる行を検索せよ!
$ egrep '5$' data.txt

\(バックスラッシュ)は、エスケープシーケンスという特別な意味を表すことができます。

例えば、「Johnさんだけを検索せよ!」と言われた場合には、
$ egrep 'John' data.txt
と書いてはいけません。
なぜなら、これではJohnさんだけでなく、Johnsonさんも検索されてしまうからです。

そこでエスケープシーケンスを使います。
代表的なエスケープシーケンスには下記のものがあります。


上記の中の、空白文字にマッチする\sのエスケープシーケンスを使って、Johnさんだけを探すと
$ egrep '\sJohn\s' data.txt
となります。
こちらは、「(空白)John(空白)だけを検索してください!」という意味です。

これらメタ文字を使うことで、正規表現で単純な文字列検索ではできない検索や置換を行うことができるのです。
. * + [ ] ( ) \ | ? ^ $

ちなみに、
メタ文字をそのまま文字自体として使う場合には、その文字の前に/(スラッシュ)を置きます。

例えば、/+とすれば+の意味のまま、特殊な意味は持たないようになります。

以上は検索でしたが、置換する場合でも正規表現を使うことができます。

置換には、
$ perl -pe 's/検索する正規表現/置換内容/g' data.txt
というコマンドを使って、置換をしていきます。
置換ではヒットした内容の参照を行うことができます。

正規表現は、開発をしていく上で必須のものなので、早く使い慣れていきたいですね。



本研修でたくさんの方々に協力していただいています。

ありがとうございました!


このエントリーをはてなブックマークに追加