正規表現

	// ' または\の文字を含むかの判定です。下記前後の".*"で、「0文字以上の何らかの文字」を意味しています。
	String regex = ".*['\\\\].*";
	System.out.println("regex =" + regex  );
	System.out.println(" abc ". matches( regex ) );
	System.out.println(" '   ". matches( regex ) );
	System.out.println(" \\   ". matches( regex ) );
	System.out.println("' OR  mail ='tarou@gmail.com". matches( regex ) );

正規表現(regular explession)とは、文字が並ぶ集合を、特別な文字列で表現する方法で、 文字列の分割、検索、置換でよく使われます。
基本的なメタ文字を以下に示します。

文字説明 補足・例
.改行以外の任意の一文字 b..k は、book, backの文字列にマッチします
? 直前の正規表現の0回 または 1回に一致で、{0,1}の量指定と同じ ax?d は、xの文字が0回か、1回にマッチするので、以下列挙文字列で太字がマッチ範囲です。"2adg", "2axdg"
* 直前の正規表現の回以上の繰り返しに一致で、{0,}の量指定と同じ ax*d は、xの文字が0回以上でマッチするので、以下列挙文字列で太字がマッチ範囲です。"2adg", "2axdg", "2axxdg", "2axxxdg"
+ 直前の正規表現の回以上の繰り返しに一致で、{1,}の量指定と同じ ax+d は、xの文字が1回以上でマッチするので、以下列挙文字列で太字がマッチ範囲です。 "2axdg", "2axxdg", "2axxxdg"("2adg" は、マッチしません)
^ 先頭に一致 ^ab は、abの文字列から始まる"abcde"の太字がマッチ範囲です。"aabcde"はabが先頭でないためマッチしません。
$ 終端に一致 yz$ は、yzの文字列で終わる"wxyz"の太字がマッチ範囲です。"wxyzz"はyzが終端でないためマッチしません。
[][ ]内の文字のどれかに一致 ([abc])は、"(a)"または、"(b)"または、"(c)"にマッチします。また、/[0-9]/で数字の文字にマッチします
[^ ] [ ]内以外の文字と改行以外の一文字に一致 xy[^abc]zは、"xyez"や、"xyfz"などにマッチします。
|正規表現の論理和 a[+|-]b は、a[+-]bと同じになります。つまり"a+b"または"a-b"とマッチします。
()グループ化 a(bc)|(BC)dは、"abcd"や"aBCd"とマッチします。
{m,n}n回以上で、m回以下に一致とする量指定 t[0-9]{3,3}は、"t123.txt"の太字がマッチ範囲です。"t12.txt"の"t12"では3回以上の繰り返しに達していないのでマッチしません。

ここでは、正規表現の文字列を使うクラスを紹介します。

 Stringのsplitメソッド

引数の正規表現文字列を使って、文字列を分割して配列に記憶し、 その配列を返す便利なメソッドです。

	//s1の文字列をs2の正規表現の文字列で分割し、配列に入れて戻す。
	String []a = s1.split(s2);
	for(String s : a){
		System.out.println(s);
	}

次の最初の入力フィールドがs1に記憶され、 次の入力フィールドがs2に記憶されます。 その時の上記コードを、実行ボタンで確認できます。

 splitメソッドの例
(表計算などで使われるCSVのファイルから、項目を取得する例)

例えば、クラスと同じ位置に次のdata.csvのファイルがあるとします。
このようにCSV(Comma Separated Value)フィールドを、コンマ(,)で 区切って列挙したテキストのデータフォーマット形式です。

商品分類,商品名,単価,数量
食品,アンパン,100,5
生活雑貨,歯ブラシ,210,10
生活雑貨,タオル,98,12
食品,おにぎり,110,6
食品,弁当,500,4

上記ファイルから各項目が記憶される2次配列を取得する例を示します。
以下では、この取得メソッドをgetCsvItemsで定義し、 それを使って、2次配列を取得して、それを表示している例です。
getCsvItemsメソッドでは、引数で指定しているdata.csvのファイルから 1行ずつ読み取って、spriteメソッドで分割し、それをArrayListに追加します。 最後で、ArrayListから配列を取得してそれを返しています。

import java.io.*;//InputStreamReader,BufferedReader利用のため
import java.util.*; //ArrayListクラス利用のため

public class Test
{
	public static String[][] getCsvItems(String path) throws Exception
	{
		ArrayList <String[]>lst = new ArrayList <String[]>();
		
		java.net.URL url = Test.class.getResource(path);
		InputStream is = url.openStream(); //読み込みストリーム生成
		InputStreamReader isr = new InputStreamReader(is);//文字ストリームに変換
		BufferedReader br = new BufferedReader(isr);//行ストリームへ変換
		String s;
		while((s=br.readLine()) != null){
			//System.out.println(s);
			String []a = s.split(",");//","の正規表現文字列で、sを分解
			lst.add(a);	
		}
		is.close();
		String [][]rtn = new String [0][0];
		return lst.toArray(rtn);
	}

	public static void main(String argv[]) throws Exception
	{
		String[][] items = getCsvItems("data.csv");
		
		for(int n=0; n < items.length; n++){
			for(int i=0; i < items[n].length; i++){
				System.out.print("\t" + items[n][i]);
			}
			System.out.println();
		}
	}
}

上記の実行結果を以下に示します。

Z:\java>java Test
        商品分類        商品名  単価    数量
        食品    アンパン        100     5
        生活雑貨        歯ブラシ        210     10
        生活雑貨        タオル  98      12
        食品    おにぎり        110     6
        食品    弁当    500     4