新春第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個以上の繰り返し(+の前の文字やグループが繰り返す)

----------------------------------------------------------