矮小

井の中の蛙

Javaの正規表現のマッチのさせ方

この記事は システム主専攻ver1.0 Advent Calendar 2014 - Adventar の1日目の記事です.なんで今さら2014年のアドベントカレンダーなんかやってるのかって? そんなのは知りません.

機械学習の研究室で,指導教員がJava使いなのでゼミ生もJavaチュートリアルのプログラムを進めています.コーパスのテキストデータをパースする必要が出てきたのでパーサーを書いていたのですが,そこでJavaの挙動に翻弄されました.

読み込みたいファイルのヘッダが下みたいな感じでした.

*x*x*x*x*x*x*x*x*x*x*x*x
*x*x*x*x*x*x*x*x*x*x*x*x
*x*
*x*

という枠があったので,上の行を飛ばすために当然のようにPattern.Compile("^\\*x\\*")と書いたんですが,これがマッチしない.そして1時間以上に渡る調査を続け,私はついに答えにたどり着きました.

Matcher.matches
領域全体をこのパターンとマッチします。
Matcher.find
入力シーケンスからこのパターンとマッチする次の部分シーケンスを検索します。

ということで何の事はない,ただの私のドキュメントの見落としでした.具体的にはsomePattern.matcher(someInput).find()みたいに書けば部分一致するかどうか判定してくれます.みなさんもJava正規表現を使う時はこんなしょうもないところでハマらないようにしましょう.