あなたがブログで勉強日記をつけるべき6つの理由

正規表現はほんの基礎しか解説しないつもりだったのに、ここ数日どんどん解説してしまいます。(笑)
でも、他の人にわかるように書く事で、自分の理解が深まる気がします。こういったブログのようなパブリックなスペースでは、常に人の目を意識しなくてはいけないので、自然と「どう書けばわかりやすいかな」と考えるようになってきました。
わざわざ正規表現を解説してしまうのも、「このパターンがわからないと、このプログラムは理解してもらえないよなぁ……」と考えてしまうからです。

という文章を書いていたら、勉強日記の先輩である id:rubyco さんこと結城浩さんが、同じことを書いていました。(^_^;)
どうやら、ブログで勉強日記を付けると、そういう効果があるようですね。そこで、勉強日記をブログでつけるメリットをまとめてみました。
題して「あなたがブログで勉強日記をつけるべき6つの理由」。この6つの理由が、あなたを動かすきっかけになれば幸いです。(^_^)

  1. 自分の勉強の記録が残せる。
    1. 「ああ、自分はこんなに勉強したんだな」と実感できる。
    2. ブログなのでネットを通じてどこからでも参照できる。
    3. 検索も簡単にできる。
    4. 時系列や、タグによる分類など、整理整頓もしてくれる。
    5. ノートと鉛筆じゃこうはいかない。
  2. 人の目を意識する事で、自然と理解が深まる。
    1. 物事を人にわかりやすく書くには、まず自分自身がその物事を良く理解する必要がある。
    2. ブログのような公共の場では、読んでいる人に理解してもらえなければ意味がない。
    3. つまり、ブログだとそれが自然とできる。
  3. 勉強する気になる。
    1. 日記をつける感覚で勉強できる。
    2. ネットがあれば、どこでも勉強できる。
    3. コメントやトラックバックをもらうと、やる気がでる。
  4. 理解が間違っているとツッコんでもらえる(と期待できる)。
    1. ツッコんでもらえれば正しい理解が得られる。
    2. もちろんツッコミがもらえるとは限らないので、なるべく自力で正しく理解するよう努力する事。
  5. その分野に興味がある人と交流できる。
    1. 同じテーマについて、コメントやトラックバックなどで意見交換ができる。
    2. トラックバックの打ち合いは、とても楽しい。(少なくとも僕は)
    3. 色々な人と交流することで、新しい発見が必ずある。
  6. なにより楽しい。
    1. 1人で勉強するより、みんなで勉強する方が楽しい。
    2. 1人で黙々と本を読むより、みんなで読んだ知識を共有した方が楽しい。
    3. 1人で鉛筆を動かすより、みんなに向けて文章を書く方が楽しい。

そうなんです。楽しいんですよね。ブログで勉強日記。
もし、あなたが何か新しい勉強を始めようとしているなら――プログラミング言語でもいいし、何か難しい本にチャレンジしたり、学校の授業の復習でもいいでしょう――ブログで勉強日記を付けるのがオススメです。
きっと、素敵な勉強日記になると思います。

正規表現(5) キャプチャ

正規表現の中でカッコ ( ) を使うと、マッチした文字列の一部をキャプチャ(捕獲)して後で使う事ができます。これは、正規表現を使う上でとっても重要なテクニックです。
例えば

m/aaa(bbb)ccc/

というパターンがあるとします。この検索パターンは「aaabbbccc」という文字列にマッチします。カッコは特殊な文字なので、検索する時は無いモノとして扱われるのです。つまり「aaa(bbb)ccc」という文字列にはマッチしません。*1

"aaabbbccc"   =~ m/aaa(bbb)ccc/;  # 真:マッチする
"aaa(bbb)ccc" =~ m/aaa(bbb)ccc/;  # 偽:マッチしない 

このパターンの場合、「bbb」をキャプチャしている事になります。キャプチャした文字列は左のカッコから順番に $1、$2、$3、$4… という連番の変数に入ります。
例えば、以下の場合

"abcdef" =~ m/a(b)c(d(e)f)/;  # マッチする
print "$1\n$2\n$3\n";

実行すると

b
def
e

と表示されます。$1に「b」が、$2に「def」が、$3に「e」が入っていますね。(^_^)

このキャプチャを利用すると、substr 関数などを使わなくても、簡単に文字列の一部を取り出す事ができます。(ただし、「パターン」を見つける必要があります)
例えば、Windows の設定ファイルの一種として INI ファイルというものがありますが、一行が「名前=値」という書式になっています。*2
この1行を取り出したとして、ここから名前と値を取り出したいとすると

use strict;
 
my $line = "Food=Apple";   # INIファイルから取り出した1
 
if ($line =~ m/([^=]+)=(.+)/) {
	print "Name : $1\n";
	print "Value: $2\n";
}

のようになります。
実行結果は以下の通り。

Name : Food
Value: Apple

とっても楽チンですね。(^_^)

使用した正規表現

m/([^=]+)=(.+)/

について詳しく説明すると、まず1つめのカッコ($1)が名前にあたり、「=」をはさんで、2つめのカッコ($2)が値にあたります。
「[^=]+」は、「= 以外の文字列」にマッチします。「[^=]」は「= 以外の何か1文字」、「+」は「直前の文字が、1個以上連続する」という意味ですから、「=」までの文字列(Food)にマッチします。(^_^)
「.」(ドット)は、「改行以外の何か1文字」にマッチします。「+」を付ける事で末尾までの文字列を取得しています。
「+」(1文字以上)、「*」(0文字以上連続)、「?」(0文字または1文字)のような「文字の連続量を表す」特殊文字の事を「量指定子」と呼びます。量指定子を使った正規表現は、できるだけ「長く」マッチしようとします。あればあるだけ飲み込んでしまう「欲張り」なマッチです。(^_^;)
これを「できるだけ短く」にするには、量指定子の後ろに「?」を付ければ良いそうです。

use strict;
 
"aaabbbaaabbbaaabbb" =~ m/.+b/;
print "$&\n";   # $& はマッチした文字列全体
 
"aaabbbaaabbbaaabbb" =~ m/.+?b/;
print "$&\n";

前者のパターンでは、「+」なのでできるだけ長くマッチします。後者は「+?」なのでできるだけ短くマッチします。
実行結果は以下の通り。

aaabbbaaabbbaaabbb
aaab

正規表現を使うと、文字列処理がとても簡単ですね。正規表現が無いプログラミング言語ではこうはいきません。
「名前=値」を扱うにも、まず「=」の位置を探して…「=」の前までの文字列を切り出して…「=」の後ろから末尾までの長さを求めて…「=」の後ろの文字列を切り出して…大変です。(^_^;
正規表現は工夫しだいで色々な事に使えそうですね♪

*1:ちなみに、カッコを普通の文字として扱いたい場合は、前に「\」(円記号)をつけてエスケープします。例:m/aaa\(bbb\)ccc/ → "aaa(bbb)ccc" にマッチします。

*2:厳密には、[Category] のようなカテゴリもあります。