株式会社エスロジカル
株式会社エスロジカル
セキュリティ、Web開発、Unix開発、Go言語

■ Java:正規表現(java.util.regex)

技術ドキュメント目次 -> Java -> 正規表現(java.util.regex)

本技術ドキュメントは、ここしばらくメンテナンスをしておりません。
内容が古くなっている可能性などございますこと、ご理解を頂けますようお願いいたします。


サイフにやさしいSSL証明書
【低価格SSL証明書】弊社運営の低価格SSL証明書販売サイト、翌月末払いなど請求書払いも可能。


◆ はじめに

JDK1.4から、java.util.regex パッケージが導入され、
正規表現のクラスが標準で使用できるようになりました。

たとえば Web開発での文字列チェックなど、
さまざまな用途で非常に有用だと思いますので、ぜひチャレンジしてみてください。

◆ サンプルプログラム

サンプルのために、
正規表現の utilクラスである RegexUtil と、
RegexUtil のデモのために作成した RegexUtilDemo というクラスを作成しました。

次の3種の文字列操作を行うときの参考にしていただければ幸いです。
・パターンマッチ
・文字列の分割
・文字列の置換

それぞれのソースコードは次のとおりです。

(RegexUtil.java)
/*
 * Copyright (C) 2006 Slogical Corporation
 */
import java.util.regex.*;

public class RegexUtil {

    /**
     * パターンマッチのテストを行い、結果を booleanで返す。
     */
    public boolean regMatch(String p, String s) {
        Pattern pattern = Pattern.compile(p);
        Matcher matcher = pattern.matcher(s);
        return matcher.matches();
    }

    /**
     * パターンマッチのテストを行い、結果を booleanで返す。
     * 大文字小文字の区別は行わない。
     */
    public boolean regMatchIC(String p, String s) {
        Pattern pattern = Pattern.compile(p, Pattern.CASE_INSENSITIVE);
        Matcher matcher = pattern.matcher(s);
        return matcher.matches();
    }

    /**
     * 文字列を分割して、結果を String[] で返す。
     */
    public String[] regSplit(String p, String s) {
        Pattern pattern = Pattern.compile(p);
        return pattern.split(s);
    }

    /**
     * 文字列を分割して、結果を String[] で返す。
     * 分割数の上限指定も行う。
     */
    public String[] regSplit(String p, String s, int limit) {
        Pattern pattern = Pattern.compile(p);
        return pattern.split(s, limit);
    }

    /**
     * 文字列の置換を行い、置換された文字列を返す。
     * 最初にマッチしたものしか置換しない
     */
    public String regReplaceFirst(String p, String r, String s) {
        Pattern pattern = Pattern.compile(p);
        Matcher matcher = pattern.matcher(s);
        return matcher.replaceFirst(r);
    }

    /**
     * 文字列の置換を行い、置換された文字列を返す。
     * マッチするものはすべて置換する
     */
    public String regReplaceAll(String p, String r, String s) {
        Pattern pattern = Pattern.compile(p);
        Matcher matcher = pattern.matcher(s);
        return matcher.replaceAll(r);
    }

    /**
     * 文字列の置換を行い、置換された文字列を返す。
     * マッチするものはすべて置換する
     * matcher.find() を用いて実装する。
     */
    public String regReplaceAll2(String p, String r, String s) {
        Pattern pattern = Pattern.compile(p);
        Matcher matcher = pattern.matcher(s);
        StringBuffer sb = new StringBuffer();
        while (matcher.find()) {
            matcher.appendReplacement(sb, r);
        }
        matcher.appendTail(sb);
        return sb.toString();
    }
}


(RegexUtilDemo.java)
/*
 * Copyright (C) 2006 Slogical Corporation
 */
import java.lang.*;
import java.util.regex.*;

public class RegexUtilDemo {

    /**
     * メイン
     */
    public static void main(String[] args) {

        RegexUtil rutil = new RegexUtil();

        System.out.println("----- パターンマッチのテスト");
        System.out.println( rutil.regMatch("^abcd[0-9]$", "abcD1") );

        System.out.println("----- パターンマッチのテスト:大文字小文字区別しない");
        System.out.println( rutil.regMatchIC("^abcd[0-9]$", "abcD1") );

        System.out.println("----- 文字列分割のテスト");
        String s1[] = rutil.regSplit(" ", "This is a test.");
        for (int i=0; i<s1.length; i++) {
            System.out.println(i + ": " + s1[i]);
        }

        System.out.println("----- 文字列分割のテスト:分割数の上限指定");
        String s2[] = rutil.regSplit(" ", "This is a test.", 2);
        for (int i=0; i<s2.length; i++) {
            System.out.println(i + ": " + s2[i]);
        }

        System.out.println("----- 文字列置換のテスト");
        System.out.println( rutil.regReplaceFirst("a", "A", "Japan") );
        System.out.println( rutil.regReplaceFirst("a", "A", "abcdefaaa") );

        System.out.println("----- 文字列置換のテスト:全て置換する");
        System.out.println( rutil.regReplaceAll("a", "A", "Japan") );
        System.out.println( rutil.regReplaceAll("a", "A", "abcdefaaa") );

        System.out.println("----- 文字列置換のテスト:全て置換する:別実装");
        System.out.println( rutil.regReplaceAll2("a", "A", "Japan") );
        System.out.println( rutil.regReplaceAll2("a", "A", "abcdefaaa") );

    }

}


◆ サンプルプログラム実行結果

サンプルプログラムの実行結果は次のようになります。
ソースコードとにらめっこしてみてください。

$ java RegexUtilDemo
----- パターンマッチのテスト
false
----- パターンマッチのテスト:大文字小文字区別しない
true
----- 文字列分割のテスト
0: This
1: is
2: a
3: test.
----- 文字列分割のテスト:分割数の上限指定
0: This
1: is a test.
----- 文字列置換のテスト
JApan
Abcdefaaa
----- 文字列置換のテスト:全て置換する
JApAn
AbcdefAAA
----- 文字列置換のテスト:全て置換する:別実装
JApAn
AbcdefAAA
$




■ Java についての他のドキュメント


■ 他のグループのドキュメント

Apache  /  Linux  /  FreeBSD  /  OpenSSL  /  Perl  /  HTTPプロトコル  /  Jakarta Tomcat  /  Java  /  NetBSD  /  Oracle  /  PostgreSQL  /  UNIX の C言語  /  UNIX のコマンド  /  Windows  /  bind  /  システム運用TIPS

アンケートにご協力をお願いいたします。

1. このドキュメントへの評価をご選択ください。
         

2. ご感想をお書きください。