正規表現

正規表現

正規表現

正規表現とは、一定の規則に従って文字列を表す表現です。例えば、「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 = "[email protected]";
    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);
    
    // < → &lt;
    str = "<";
    System.out.println("置換前の値 : " + str);
    str = str.replaceAll("<", "&lt;");
    System.out.println("置換後の値 : " + str);
    
    // > → &gt;
    str = ">";
    System.out.println("置換前の値 : " + str);
    str = str.replaceAll(">", "&gt;");
    System.out.println("置換後の値 : " + str);
    
  }
}

● コンパイルと実行結果
C:\java>javac RegexTest3.java

C:\java>java RegexTest3
置換前の値 : &
置換後の値 : &amp;
置換前の値 : <
置換後の値 : &lt;
置換前の値 : >
置換後の値 : &gt;

C:\java>

你可能感兴趣的:(正規表現)