正規表現にマッチした部分を取り出す

単語にマッチさせる
特定の文字・文字列の出現回数を調べる
文字の出現頻度を調べる

正規表現は上記などでもやったはずなんだけど、どうもまだ慣れない。
Groovyイン・アクション P65〜P73

「a」で始まる3文字を取り出す

"xxxabcffpat".find(/a../)
===> abc

正規表現がマッチしない場合

"xxx".find(/a../)
===> null

マッチした部分をすべて取り出す

("static int fact(int n){...}" =~ /\w+/).each{println it}
static
int
fact
int
n
===> java.util.regex.Matcher[pattern=\w+ region=0,27 lastmatch=]

正規表現の「()」にマッチした部分を取り出す

  • Rubyのメソッド名らしき部分を抜き出す
    ("def print(str)" =~/^\s*def\s+([^\s\(]+)/).each{println it[1]}
    print
    ===> java.util.regex.Matcher[pattern=^\s*def\s+([^\s\(]+) region=0,14 lastmatch=]
  • Javaのメソッド名らしき部分を抜き出す
    ("static int fact(int n){...}" =~/\s+\w+\s+([^\s\(]+)/).each{println it[1]}
    fact
    ===> java.util.regex.Matcher[pattern=\s+\w+\s+([^\s\(]+) region=0,27 lastmatch=]

正規表現の()が複数あり、マッチした部分を全部まとめて取り出す

  • まとめて
    ("xxabcfffpatxxx" =~/(abc)(f+)(\w{3})/).each{println it[1..-1]}
    [abc, fff, pat]
    ===> java.util.regex.Matcher[pattern=(abc)(f+)(\w{3}) region=0,14 lastmatch=]
  • 各要素
    ("xxabcfffpatxxx" =~/(abc)(f+)(\w{3})/).each{it[1..-1].each{println it}}
    abc
    fff
    pat
    ===> java.util.regex.Matcher[pattern=(abc)(f+)(\w{3}) region=0,14 lastmatch=]

実行環境








Groovyの詳細についてはJavadocと以下の書籍を参考にしている。
ページ番号は、この書籍のページ番号

Groovyイン・アクション
Dierk Konig Andrew Glover Paul King Guillaume Laforge Jon Skeet
毎日コミュニケーションズ
売り上げランキング: 294340


問題自体は以下の書籍のもの。rubyと似てる部分も多いので、ヒントにもなる。
写経でもいいが自分で考えるために他言語の例をGroovyで置き換えてる。

Rubyレシピブック 第2版 268の技
青木 峰郎 後藤 裕蔵 高橋 征義
ソフトバンク クリエイティブ
売り上げランキング: 80467


Groovyイン・アクションを読むならあった方が便利かな。

ブックストッパー
ブックストッパー
posted with amazlet at 10.05.16

トモエ算盤
売り上げランキング: 614


Rubyレシピブックは「ほんたった」で立ててる

EDISON ほんたった黒(ハードケース入り)
株式会社エジソン
売り上げランキング: 2164