第8章 正規表現の詳細 練習問題 その1

この練習問題の冒頭を引用すると、

この章の練習問題は、本書の中で最も難易度がたかくなっています。

となって、いきなり脅されまくりですよ。そのうえねみぃので半分くらいの予定で;)。

1. 略

正規表現を書けという問題。問題文があまりに長ったるいので、問題を書く前に正規表現を先に書いた方が世の中のみんなが幸せになれそうですよね。*1で、その正規表現は、

\b(fred|wilma)\s+flintstone

となります。

2.以下の正規表現はどんな文字列にマッチするか

問題を引用します。

/"([^"]*)"/            #1
/^0?[0-3]?[0-7]{1,2}$/ #2
/^\b[\w.]{1,12}\b$/    #3

1番は詳説正規表現でも見た表現です。意味的には、ダブルクォーテーションで囲まれた文字列にマッチして、ダブルクォートの内側の文字列を括弧で記憶する、ですかね。.*じゃなくて[^"]になっているのは、.*にすると、

"this", "is", "a", "pen"

なんて文字列があったときに、はじめの"this"にマッチせずに、
この文字列、"this", "is", "a", "pen"全体にマッチしてしまうからです。*は欲張りだから、まず最後まで読み込んで、もどりながらマッチするんだった。で.の代わりに[^"]とすれば問題なし。ただ、/"([^"]*)"/ は

"I say \"hello\""

というような文字列だと、"I say \"にマッチしちゃう。そのあたりの細かなことは詳説正規表現が説明してくれてるはず。

2番は8進数?これだけだとよくわかんないです。3番はさらによくわかんない。うーん。てなところで本日は時間がきたので、ここまでで。また明日すこし進めます。

詳説 正規表現 第2版

詳説 正規表現 第2版

*1:この問題の正規表現のはじめの\bを忘れてたりしても、初めてのPerlが手元にあるひとしかそれが間違いとわからないとかね。<- 忘れてました