サイトアイコン IT NEWS

JavaでASCIIの制御文字を置換する3つの方法

java-ascii-control-character

今までJavaに関する記事を投稿したことはありませんが、仕事で少しだけ文字コード変換を行う際に使いましたので、記事にしたいと思います。
何分、Javaに関しては初心者ですので、誤り等ありましたらご指摘の程よろしくお願い致します。
初回はASCII制御文字置換する方法について紹介します。

1. 正規表現を利用した置換方法

特定の文字を単純に指定した文字に置換するだけなら、文字列String)に対してreplaceAll()を利用して1行で済みます。

str.replaceAll("\p{C}", "");

Stack OverflowにQ&Aがありましたので、そのまま引用しています。

この正規表現p{C}」(先頭のバックスラッシュ””はエスケープです)は、ASCII制御文字である「0x000x1F」を削除します。
詳しい正規表現はこちらをご覧ください。

基本はこれで問題ないです。
しかし、文字コードを細かく指定したい場合は、次の2つの方法が有効です。

2. 1文字ずつ判定して置換する方法

以下のコードは、文字列(String)を1文字ずつループし、文字コードASCII制御文字かどうかを判定して置換します。
最終的に置換後の文字列を返す関数を作って見ました。

public static String replaceControlCharacter(String str) {
    if (str == null) {
        return str;
    }
    StringBuffer sb = new StringBuffer();
    for (int i = 0; i < str.length(); i++) {
        char c = str.charAt(i);
        if (c >= 0x00 && c <= 0x1F) {
            sb.append("");
        } else {
            sb.append(c);
        }
    }
    String result = sb.toString();
    return result;
}

説明

関数の引数に文字列(String)を渡します。
for文で文字数(str.length())だけループを回します。
あとは、Char型の変数に格納したも文字をif文でASCII制御文字0x000x1F)かどうか判定してStringBuffer変数にappend()していきます。
if分の箇所は自由に指定できるので、自由に置換したい文字コードを指定することができます。
最後は、toString()関数で文字列にして返却します。

3. MatcherとPatternクラスを利用する

もう1つは、JavaMatcherPatternという便利なクラスを利用します。
以下のサンプルは、クラス変数(Pattern)などに置換対象の文字コードを指定し、Matcherクラスを利用して文字列の中から一致した文字をreplaceAll()関数で置換する方法です。

import java.util.regex.Matcher;
import java.util.regex.Pattern;
・・・
private static final Pattern controlCharacters = Pattern.compile(
    "[\u0000-\u001F]");
・・・
public static String replaceControlCharacters(String str) {
    Matcher match = controlCharacters.matcher(str);
    return match.replaceAll("");
}

説明

クラス変数ASCII制御文字コード範囲を指定します。
そして、matcher()関数の引数に文字列を渡して、変数(Mather)に格納し、最後は1つ目の方法と同じようにreplaceAll()関数を利用して置換して完了です。
こちらが参考サイトです。

情報ありがとうございます!

最後に…

このように、Java文字コード変換をするのが初めてでしたので、様々なサイトを参考にさせていただきました。
その中で「正規表現を使うと処理が遅い」という情報が多かった気がします。
それを踏まえると2番目の変換方法がオススメです。
そして、ASCII制御文字0x7F0x9Fu007fu009f)を含めるかどうかも参考にしたサイトによって異なりました。
1番目のケースで言うと「p{Cc}」のような書き方になります。
この辺りも要件によって異なると思いますので、皆さんのご意見も頂けると幸いです。

モバイルバージョンを終了