Yokohama.groovy #5 に参加しました
2012/10/02 Yokohama.groovy #5 #yokohamagroovy - Togetterまとめ
20121002 vol.05 · yokohamagroovy/support Wiki · GitHub
諸事情によりしばらく参加できなかったので、1 ヶ月ぶりの参加です。
休んでる間に Github アカウントができてたり素晴らしいですね!
今回の参加者は 4 人。
いつも通りビール片手にゆるゆるとやってきました。
やったこと
- 作者: 関谷和愛,上原潤二,須江信洋,中野靖治
- 出版社/メーカー: 技術評論社
- 発売日: 2011/07/06
- メディア: 単行本(ソフトカバー)
- 購入: 6人 クリック: 392回
- この商品を含むブログ (155件) を見る
範囲は "3.9 制御構造" から "3.12 Java との上位非互換" まで。
本の内容について思った事を話したり、写経して動かしてみたり。
PowerAssert 便利だよね、セミコロンレスって何がメリットなんだろうとか、色々話題はありましたが、今回の個人的メインは "3.11 正規表現処理" でした。
Groovy の正規表現
- 文字列 ==~ /正規表現パターン/
- 文字列全体がパターンにマッチするかどうか (true/false) を返す
- 文字列 =~ /正規表現パターン/
- java.utilregex.Matcher オブジェクトを返す
- assert など真偽値で評価される場合、暗黙的に Matcher#find() が呼び出される
- 結果としてパターンにマッチする部分が文字列に含まれているかどうかの判定に使える
- 明示的に Matcher#matches() を呼び出せば、全体マッチの評価もできる
"=~" と "==~" の違いについては理解しましたが、部分マッチも全体マッチも "=~" で取得した Matcher を使って明示的に評価した方がコードが読みやすいと感じました。
"==~" の効果的な使い方が分からなかったので、たぶん、"=~" しか使わないんじゃないかと。
あと、リスト 3.91 の誤植で軽くハマりました。
正規表現部分をよく見ればわかったはずなんですけどね。情けない。
リスト 3.91
def expected = [['a', 'bb', 'ccc'], ['aaa', 'bb', 'c']] def target = "a bb ccc aaa bb c" i = 0 (target =~ /(a+) (b+) (c+)/).each {g0, g1, g2, g3 -> assert [g1, g2, g3] == expected[i++] } i = 0 target.eachMatch(/(a+) (b+) (c+)/) { g0, g1, g2, g3 -> assert [g1, g2, g3] == expected[i++] }
その他試したコードなど
assert "abcdef".matches(/a.c/)
assert "abcdef".matches(/a.c/) | false
assert "abcdef".find(/a.c/) == true
assert "abcdef".find(/a.c/) == true | | abc false
assert "abcdef".find(/a.c/) == "abc"
次回以降
多分、4 章 "Groovy のライブラリ" と 5 章 "進んだ話題" までやって一区切りかな。
進んだ話題の黒魔術 (の一端) が気になるところ。