初めてのPerl 第8章
練習問題の回答をメモ。正規表現って奥が深そう。
ex08-1
#!/usr/bin/perl use strict; while (<>) { chomp; # 正しくは:/\b(fred|wilma)\s+flintstone\b/ if (/(fred|wilma)\s+flintstone/) { print "Matched: $`<$&>$'\n"; } else { print "No match.\n"; } }
「ワードにマッチする」っていう条件を見逃してた。
ex08-2
「/^\b[\w.]{1,12}\b$/」という正規表現をよく理解していなかった。文字クラスの中ではドット「.」は通常の文字を表す。また、ドットはワードには含まれないから、この例では文字列の先頭と末尾にはドットを置けないことに注意。
ex08-3
#!/usr/bin/perl use strict; while (<>) { chomp; # 間違い:/^\$[^0-9]\w*$/ if (/^\$[A-Za-z_]\w*$/) { print "Matched: $`<$&>$'\n"; } else { print "No match.\n"; } }
[^0-9]では条件がゆるすぎ。これだと[0-9]以外にマッチしてしまう。
ex08-4
#!/usr/bin/perl use strict; while (<>) { chomp; # 正解は:/\b(\w+)(\s+\1)+\b/ if (/\b(\w+)(\s+\1\b)+/) { print "Matched: $`<$&>$'\n"; } else { print "No match.\n"; } }
簡単そうに見えて、考えてみるとちょっと面倒だった。
反省点
文字クラス内では記号の意味が変わってくることに気をつけよう。
ドットはワードには含まれないよ。
ワード境界アンカーを指定し忘れていないか確認しよう。