正規表現
正規表現とは、一定の規則に従って文字列を表す表現です。例えば、「abcdeg」「abcd」と文字列があったと時に、「ab*」と一定の規則を持たせた場合に、「abcdeg」「abcd」の2つの文字列が表現されます。
主に、正規表現と聞くと、JavaScrptや、perlなどが代表的なところでしょう。昔から、Javaは文字列表現には適さなかったのです。しかし、JDK1.4からこの正規表現が使えるようになりました。これで、結構簡単なチェックロジックや、置換処理が簡単になったのかもしれません。
■実行環境
OS | Windows XP Professional |
---|---|
J2SE SDK | 1.4.1_01 |
■主な正規表現
● 文字クラス構文 | マッチ対象 |
---|---|
[ABC] | A,B,Cのいずれか1文字 |
[A-Z] | A~Zまでのいずれか1文字 |
[A-Za-z0-9] | A~Z, a~z, 0-9までのいずれか1文字 |
[^ABC] | A,B.C以外の文字 |
[^A-Z] | A~Z以外の文字 |
\w | 英數文字。[a-zA-Z0-9]と同様 |
\W | \w以外の文字 |
\d | 數値文字。[0-9]と同等 |
\D | \d以外の文字 |
\s | 空白文字 |
\S | \s以外の文字 |
\n | 改行文字 |
● 繰り返し
構文 | マッチ対象 |
---|---|
A+ | 1個以上連続したA(A, AA, AAA, ...) |
A* | 0個以上連続したA( , A, AA, AAA, ...) |
A? | 0または1つの任意文字( , A, B, C, ...) |
A{5} | 5回繰り返し。 AAAAAと同じ |
A{3,} | 3回以上繰り返し。 AAA+と同じ |
A{3,5} | 3回以上5回以下繰り返し。 AAAA?A?と同じ |
● 位置指定
構文 | マッチ対象 |
---|---|
^ | 行の先頭 |
$ | 行の末尾 |
では、上記の例を実際にプログラムにしてみましょう。
■サンプルプログラム
● ソースコードRegexTest.java |
/* RegexTest */ import java.util.regex.*; public class RegexTest { public static void main(String[] args) { String value = null; // 構文 [ABC] value = "C"; //value = "c"; System.out.println("1 : " + Pattern.matches("[ABC]", value)); // 構文 [A-Z] value = "T"; //value = "t"; System.out.println("2 : " + Pattern.matches("[A-Z]", value)); // 構文 [A-Za-z0-9] value = "3"; //value = "あ"; System.out.println("3 : " + Pattern.matches("[A-Za-z0-9]", value)); // 構文 [^ABC] value = "D"; //value = "B"; System.out.println("4 : " + Pattern.matches("[^ABC]", value)); // 構文 [^A-Z] value = "c"; //value = "C"; System.out.println("5 : " + Pattern.matches("[^A-Z]", value)); // 構文 \w value = "9"; //value = "た"; System.out.println("6 : " + Pattern.matches("\\w", value)); // 構文 \W value = "た"; //value = "t"; System.out.println("7 : " + Pattern.matches("\\W", value)); // 構文 \d value = "5"; //value = "k"; System.out.println("8 : " + Pattern.matches("\\d", value)); // 構文 \D value = "k"; //value = "3"; System.out.println("9 : " + Pattern.matches("\\D", value)); // 構文 \s value = " "; //value = "t"; System.out.println("10 : " + Pattern.matches("\\s", value)); // 構文 \S value = "t"; //value = " "; System.out.println("11 : " + Pattern.matches("\\S", value)); // 構文 \n value = "\n"; //value = "t"; System.out.println("12 : " + Pattern.matches("\\n", value)); // 構文 A+ value = "AAA"; //value = "BBB"; System.out.println("13 : " + Pattern.matches("A+", value)); // 構文 A* value = "A"; //value = "BBBBB"; System.out.println("14 : " + Pattern.matches("A*", value)); // 構文 A? value = "A"; //value = "AA"; System.out.println("15 : " + Pattern.matches("A?", value)); // 構文 A{5} value = "AAAAA"; //value = "AAAAAAA"; System.out.println("16 : " + Pattern.matches("A{5}", value)); // 構文 A{3,} value = "AAA"; //value = "AA"; System.out.println("17 : " + Pattern.matches("A{3,}", value)); // 構文 A{3,5} value = "AAAA"; //value = "AAAAAA"; System.out.println("18 : " + Pattern.matches("A{3,5}", value)); // 構文 ^take.* value = "takeoba"; //value = "java"; System.out.println("19 : " + Pattern.matches("^take.*", value)); // 構文 *.oba$ value = "takeoba"; //value = "java"; System.out.println("20 : " + Pattern.matches(".*oba$", value)); } } |
● コンパイルと実行結果
C:\java>javac RegexTest.java C:\java>java RegexTest 1 : true 2 : true 3 : true 4 : true 5 : true 6 : true 7 : true 8 : true 9 : true 10 : true 11 : true 12 : true 13 : true 14 : true 15 : true 16 : true 17 : true 18 : true 19 : true 20 : true C:\java> |
上記をご覧の通り、すてべ true です。コメント部分と既存の部分を入れ替えてコンパイルし、実行すると全て false になります。これは、正規表現で表されていないため、false となります。また、下記の用に具體的な処理が可能です。
● ソースコードRegexTest2.java |
/* RegexTest2 */ import java.util.regex.*; public class RegexTest2 { public static void main(String[] args) { // 攜帯電話電話番號チェック//String tel = "03-0000-9999"; String tel = "090-0000-9999"; System.out.println(Pattern.matches("090-[\\d]{4}?-[\\d]{4}?", tel)); // メールアドレスチェック//String mail = "aaabbb.net"; String mail = "aaa@bbb.co.jp"; System.out.println(Pattern.matches( "[\\d[a-z]]+@[\\d[a-z]]+.[a-z]+|[\\d[a-z]]+@[\\d[a-z]]+.[a-z]+.[a-z]+|[\\d[a-z]]+@[\\d[a-z]]+.[a-z]+.[a-z]+.[a-z]+", mail)); // 郵便番號チェック//String yubin = "123-123"; String yubin = "123-1234"; System.out.println(Pattern.matches("[\\d]{3}?-[\\d]{4}?", yubin)); } } |
● コンパイルと実行結果
C:\java>javac RegexTest2.java C:\java>java RegexTest2 true true true C:\java> |
コメント部分と既存の部分を入れ替えてコンパイルし、実行すると全て false になります。これは、正規表現で表されていないため、false となります。
さらに、正規表現を使用して、文字列の置換作業が容易となりました。下記サンプルプログラムをご覧ください。
RegexTest3.java |
/* RegexTest3 */ public class RegexTest3 { public static void main(String[] args) { String str = null; // & → & str = "&"; System.out.println("置換前の値 : " + str); str = str.replaceAll("&", "&"); System.out.println("置換後の値 : " + str); // < → < str = "<"; System.out.println("置換前の値 : " + str); str = str.replaceAll("<", "<"); System.out.println("置換後の値 : " + str); // > → > str = ">"; System.out.println("置換前の値 : " + str); str = str.replaceAll(">", ">"); System.out.println("置換後の値 : " + str); } } |
● コンパイルと実行結果
C:\java>javac RegexTest3.java C:\java>java RegexTest3 置換前の値 : & 置換後の値 : & 置換前の値 : < 置換後の値 : < 置換前の値 : > 置換後の値 : > C:\java> |