正規表現で文字列を分割する―Pattern/Matcherクラス(3)―
正規表現クラスを利用したサンプルの3つ目は、正規表現検索を利用した文字列の分割を扱います。以下のサンプルでは、文字列を
タグで分割してみます。ただ、それだけであるならば、あえて正規表現パターンを利用しなくても、固定値の
を指定すればよいと思われるかもしれません。
しかし、同じ<br>でも、場合によってはXHTML形式で<br />と記述する場合もあれば、属性付きで<br clear="all">と記述するケースもあるかもしれません。そのような場合にも「ゆらぎ」を含めて検出する際に、正規表現は非常な効果を発揮するのです。
さっそく具体的なコードを見てみましょう。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
ロジックの概要
Pattern#compileメソッドの引数として指定された正規表現パターンに注目してみてください。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
「[^>]*」は「>」以外の任意の文字列0文字以上にマッチングします。つまり、「<br」で始まり、「>」が登場するまでの任意の範囲に、この正規表現はマッチングするわけです。
文字列の分割処理自体は、Pattern#splitメソッドによって行います。splitメソッドは、マッチングした部分文字列を区切り文字として元の文字列を分割し、その結果を文字列配列として返します。
ここでは、分割された配列の中身を確認するために、生成された文字列配列をforループで(今度は空白区切りで)出力しているわけです。本項では単純にマッチングした部分すべてを分割の対象にしていますが、分割数を限定することも可能です。例えば、
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
とした場合、文字列は2つに分割され、それ以上の区切り文字があった場合も分割されない残りの文字列がそのまま返されます。splitメソッドの第2引数が省略された、または0以下の値が指定された場合には、分割数は制限されません。
Stringクラスによる代替
本項、前項で紹介した置き換え、分割の機能は、Stringクラスで代替することも可能です(ただし、J2SE 1.4以降)。以下に、対応を示しておくことにしましょう。
Stringクラス | 正規表現クラスを使用した場合 |
---|---|
String#replaceAll(正規表現,置換文字列) | Pattern.compile(正規表現).matcher(文字列).replaceAll(置換文字列) |
String#replaceFirst(正規表現,置換文字列) | Pattern.compile(正規表現).matcher(文字列).replaceFirst(置換文字列) |
String#split(正規表現[,制限数]) | Pattern.compile(正規表現).split(文字列,制限数) |
JavaでサポートしていないPerl構文
java.util.regexパッケージは、Perl5の正規表現に限りなく近い構文を提供しますが、一部、対応していない機能もあります。利用する機会も少ない機能と思われますが、以下に、Perl5で対応しており、Javaで対応していない正規表現構文について挙げておくことにしましょう。
項目 | 例 |
---|---|
条件付き構文 | (?{X})、(?(条件)X|Y) |
埋め込みコード構文 | (?{コード})、(??{コード}) |
埋め込みコメント構文 | (?#コメント) |
プリプロセス演算 | \l、\u、\L、\U |
今回はここまでです。連想配列、プロパティファイル、正規表現、どれをとってもアプリケーション開発には欠かせない重要な機能ばかりです。ここではあくまでクラスの概要を理解していただくという目的でもって、基本的な機能についてご紹介しましたが、ぜひ積極的に活用の道を皆さんなりに模索してみてください。「こんなことをやりたい」「あんなことができないだろうか」と試み、考え、そして、APIリファレンスを自分で繰ってみる。そんな行為の繰り返しが、きっと皆さんのクラスライブラリへの理解をより深めてくれるはずです。
次回は、ファイルシステムやテキストファイルの読み書きを制御するjava.ioパッケージ、ビジュアルな画像データを動的に生成するjava.awt.imageパッケージなどについて扱ってみたいと思います。どうぞお楽しみに。
Copyright © ITmedia, Inc. All Rights Reserved.