// ' または\の文字を含むかの判定です。下記前後の".*"で、「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回以上の繰り返しに一致で、{0,}の量指定と同じ | ax*d は、xの文字が0回以上でマッチするので、以下列挙文字列で太字がマッチ範囲です。"2adg", "2axdg", "2axxdg", "2axxxdg" |
+ | 直前の正規表現の1回以上の繰り返しに一致で、{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回以上の繰り返しに達していないのでマッチしません。 |
ここでは、正規表現の文字列を使うクラスを紹介します。
引数の正規表現文字列を使って、文字列を分割して配列に記憶し、 その配列を返す便利なメソッドです。
//s1の文字列をs2の正規表現の文字列で分割し、配列に入れて戻す。 String []a = s1.split(s2); for(String s : a){ System.out.println(s); }
次の最初の入力フィールドがs1に記憶され、
次の入力フィールドがs2に記憶されます。
その時の上記コードを、実行ボタンで確認できます。
例えば、クラスと同じ位置に次の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