新春第1回(214話)から始めた正規表現の解説も今回でおしまいです。これまでは文字列の検証に正規表現を使ってきましたが,今回は正規表現を使った文字列の抜き出し,文字列の置換を考えてみましょう。
まずは,文字列から部分文字列を抜き出す処理をみていきましょう。CSVファイル(カンマで区切られたテキスト・ファイル)を読み込み,表形式で画面表示したり,データベースに追加する処理はありがちです。カンマを区切りとして文字列を分解し,各項目を取り出せばよいのです。1文字ずつ読み込んで変数で連結して,カンマが現れたら,配列にでも入れていけばよいのでしょうが,それでは面倒です。正規表現を使うと,簡単にカンマで文字列をバラバラにすることができます。
---------------------------------------------------------- import java.util.regex.Pattern; public class RegexTest2 { public static void main(String[] args) { String text ="10001,kato,23456,Jackey,2345,Litty"; String ptnStr = ","; Pattern ptn = Pattern.compile(ptnStr); String[] strs = ptn.split(text); for (int i=0;i<strs.length;i++) { System.out.println(strs[i]); } } } ----------------------------------------------------------Patternクラスのsplitメソッドを使うと指定したパターンを区切り文字列として,文字列を分割することができます。
---------------------------------------------------------- 10001 kato 23456 Jackey 2345 Litty ----------------------------------------------------------strs配列をprintlnメソッドで出力すると,コンソールに上記のように表示されます。
さて,エディタの重要な機能のひとつに文字列の置換があります。文字列の置換も正規表現を使うと簡単に実現できます。
---------------------------------------------------------- import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegexTest3 { public static void main(String[] args) { String text ="www.easier.com,www.itoucom.com"; String ptnStr = "\\.com"; Pattern ptn = Pattern.compile(ptnStr); Matcher mc = ptn.matcher(text); String replaced = mc.replaceFirst(".co.jp"); System.out.println(replaced); String replaced2 = mc.replaceAll(".co.jp"); System.out.println(replaced2); } } ----------------------------------------------------------www.easier.com,www.itoucom.comのようなURLを記した文字列中の「.com」を「.co.jp」に置換するサンプルです。パターン文字列は「\\.com」とします。「\\.com」ではなく「.com」とするとドット(.)は任意の一文字を表すメタ文字なので,itoucom のucomも置換されてしまいます。そこで,\でドットをエスケープして意味を打ち消し,単なるドットにしています。
MatcherクラスのreplaceFirstメソッドを使うと,最初にパターンに一致した部分文字列だけが置換され,replaceAllを使うと全ての一致した部分が置換されます。つまり,こんな風になります。
---------------------------------------------------------- www.easier.co.jp,www.itoucom.com www.easier.co.jp,www.itoucom.co.jp ----------------------------------------------------------パターンを工夫すれば,高機能な置換処理が作成できるでしょう。正規表現のお話しは今回でおしまいですが,MindStorms日記はまだまだ続きます。 おまけとして,これまで使ったメタ文字を一覧にまとめておきます。
---------------------------------------------------------- \d 0~9の数字に一致 {n} n個の繰り返し(\d{3}は3桁の数字を表す) {n,} n個以上繰り返し(\d{3,}は3桁以上の数字を表す) {n,m} n個以上,m個以下の繰り返し(\d{3,5}は3桁以上, 5桁以内の数字を表す) \w a~z,A~Z,0~9の英数字とアンダースコア(_)に一致 \s 空白文字(スペース,タブ,改行,CRなど)に一致 . 任意の一文字に一致 [・・・・] [ ]内のいずれかの文字にマッチ ([,;:]とするとカンマ,セミコロン,コロンの いずれかの文字にマッチ) ^ 文字列の先頭を表す $ 文字列の末尾を表す (?:・・・・) グループ化 | OR(もしくは) * 0個以上の繰り返し(*の前の文字やグループが繰り返す) + 1個以上の繰り返し(+の前の文字やグループが繰り返す) ----------------------------------------------------------