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