Java正規表現による置換 - Matcher.replaceAll/String.replaceAll使い方例

2010/02/03 18:44Update
TAGS: Java | 正規表現 | regex | Matcher | replaceAll | replaceFirst | 置換

正規表現Matcher.replaceAll/String.replaceAllによる置換。

Java正規表現関連記事


Java正規表現 概要
Java正規表現によくあるマッチ パターン

Java正規表現関連クラス APIドキュメント
String (Java 2 Platform SE 5.0)
Pattern (Java 2 Platform SE 5.0)
Matcher (Java 2 Platform SE 5.0)


サンプル


public static void main(String []args) {
    String regex = "[0-9]+";    //数字を表す正規表現式
    String value = "正規表現123置換456テスト789サンプル";    //文字列
    
    //StringのreplaceFirst、replaceAllによる置換
    String ret = value.replaceFirst(regex, "**");
    System.out.println(ret);    //正規表現**置換456テスト789サンプル
    ret = value.replaceAll(regex, "**");
    System.out.println(ret);    //正規表現**置換**テスト**サンプル
    
    //MatcherのreplaceFirst、replaceAllによる置換
    Pattern pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher(value);
    ret = matcher.replaceFirst("**");
    System.out.println(ret);    //正規表現**置換456テスト789サンプル
    ret = matcher.replaceAll("**");
    System.out.println(ret);    //正規表現**置換**テスト**サンプル
    
    //ちょっとした複雑な置換
    value = "abc{yyyyMMdd}-{number}";
    ret = regexReplace(value);
    System.out.print(ret);
}

/**
 * "abc{yyyyMMdd}-{number}"のような文字列を"abc現在の日付-3桁の数字"(例:"abc20100203-123")に変換するサンプル
 * 即ち:
 *     {yyyyMMdd}:yyyyMMddのフォーマットの今日の日付に置換される
 *  {number}:3桁数の数字に置換される
 *
 * 
 * @param value "任意文字列{yyyyMMdd}任意文字列{number}任意文字列"(例:"abc{yyyyMMdd}-{number}")
 * @return 変換後の文字列(例:"abc20100203-123")
 */
private static String regexReplace(String value) {
    String ret = value;
    
    String patternRegex = "(\\{(.*?)\\})";
    
    Pattern pattern = Pattern.compile(patternRegex);
    Matcher matcher = pattern.matcher(value);

    String expression = null;
    String regexPattern = null;
    while(matcher.find()){
        int group = matcher.groupCount();
        if (group == 2) {
        expression = matcher.group(1);
        regexPattern = matcher.group(2);
        
        try {
            SimpleDateFormat sdf = new SimpleDateFormat(regexPattern);
            String datevalue = sdf.format(Calendar.getInstance().getTime());
            ret = ret.replaceAll("\\Q" + expression + "\\E", datevalue);
        } catch (Exception e) {
            if (regexPattern.equals("number")) {
            int random = (int)Math.floor(Math.random() * (999 - 100 + 1)) + 100 ;
            
            ret = ret.replaceAll("\\Q" + expression + "\\E", String.valueOf(random));
            }
        }
        }
    }
    
    return ret;
}

実行結果はソースのコメントとして記述されています。

有关作者
Syboos.jp編集長システム設計や開発、保守運営などを行ってます。オープンソース技術に興味があります。

Sponsored Link


Comments