「初めての Perl」勉強4日目
正規表現です。分からなくはないけど若干ダルいw
第七章 正規表現
練習問題1
テストプログラムを使って、fred を含むようなすべての文字列にマッチするパターンを作成してテストしてください。そのパターンを、文字列 Fred や frederick や Alfred にマッチさせるとどうなりますか?
#!/usr/local/bin/perl -w while(<>) { chomp; if (/fred/) { print "Matched: |$`<$&>`$'|\n"; } else { print "No match.\n"; } }
結果は以下の通り
Fred No match. frederick Matched: |<fred>erick| Alfred Matched: |Al<fred>|
練習問題2
テストプログラムを使って、少なくとも1個のaの後ろに、任意個の b が続くような部分を持った、すべての文字列にマッチするパターンを作成してテストしてください。「任意個」には0個も含まれることに注意しましょう。そのパターンを、文字列 barney や fred や abba や dinosaur にマッチさせるとどうなりますか?
#!/usr/local/bin/perl -w while(<>) { chomp; if (/a(b)*/) { print "Matched: |$`<$&>$'|\n"; } else { print "No match.\n"; } }
結果は以下の通り
barney Matched: |b<a>rney| fred No match. abba Matched: |<abb>a| dinosaur Matched: |dinos<a>ur|
練習問題3
テストプログラムを使って、任意個の逆スラッシュの後ろに、任意個のアスタリスクが続くような部分を持った、すべての文字列にマッチするパターンを作成してテストしてください。そのパターンを、文字列 \\** や fred や barney \\\*** や *wilma\ にマッチさせるとどうなりますか?
#!/usr/local/bin/perl -w while(<>) { chomp; if (/\\*\**/) { print "Matched: |$`<$&>$'|\n"; } else { print "No match.\n"; } }
結果は以下の通り
\\** Matched: |<\\**>| fred Matched: |<>fred| barney \\\*** Matched: |<>barney \\\***| *wilma\ Matched: |<*>wilma\|
明らかに間違いだと思います><
最初は
if (*(\\)*(\*)*) {
と書いてみたけど、結果は一緒だった。
なので回答を見てみたが、上記で示した答えで合ってるっぽい。この辺の詳細はまたあとで。
練習問題4
wilma を含むようなすべての入力行を表示するプログラムを新たに書いてください。(それ以外の行は表示せずにスキップします。)wilma だけでなく、大文字の W で始まる Wilma にもマッチするようにした人には、追加点を差し上げましょう。
#!/usr/local/bin/perl -w while(<>) { chomp; if (/(wilma|Wilma)/) { print "Matched: |$`<$&>$'|\n"; } }
入力したデータ
oinwilmaan vaoi wwWilman voiwilmasdi nvw.093 Wilmakjwa9
結果
oinwilmaan vaoi wwWilman voiwilmasdi nvw.093 Wilmakjwa9 Matched: |oin<wilma>an| Matched: |ww<Wilma>n| Matched: |voi<wilma>sdi|
これでいいのかな?
練習問題5
追加点用の問題:wilma と fred の両方が含まれている行表示するプログラムを書いてください。
分かりませんでした><
最初は
if (/((wilma)*|(fred)*)+/) {
って書いたけど、これじゃダメだった。
回答見た。
#!/usr/local/bin/perl -w while(<>) { if (/wilma/) { if (/fred/) { print; } } }
これは気付かない><