8

非表示のASCII文字を保持しながら、印刷できないASCII文字をすべて文字列から削除したいと考えています。空白、 \n \r は目に見えない文字ですが、印刷できないので、これでうまくいくと思いましたか? 基本的に、私は � 文字を含むバイト配列を取得していますが、それらを入れたくありません。だから私はそれを文字列に変換しようとしています。それを再びバイト配列として使用する前に、文字を削除してください。

現在、スペースは私のコードで正常に機能しますが、\r と \n は機能しません。これらも保持する正しい正規表現は何でしょうか? それとも、私がやっていることより良い方法はありますか?

public void write(byte[] bytes, int offset, int count) {

    try {
        String str = new String(bytes, "ASCII");
        str2 = str.replaceAll("[^\\p{Print}\\t\\n]", "");
        GraphicsTerminalActivity.sendOverSerial(str2.getBytes("ASCII"));

    } catch (UnsupportedEncodingException e) {

        e.printStackTrace();
    }

     return;
 }

} 

編集: ascii 文字の範囲である [^\x00-\x7F] を試しましたが、それでも � 記号が通過します。

4

2 に答える 2

13

次の正規表現は、印刷可能なテキストにのみ一致します

[^\x00\x08\x0B\x0C\x0E-\x1F]*

次の正規表現は、印刷できない文字を検索します

[\x00\x08\x0B\x0C\x0E-\x1F]

ジェイブコード:

boolean foundMatch = false;
try {
    Pattern regex = Pattern.compile("[\\x00\\x08\\x0B\\x0C\\x0E-\\x1F]");
    Matcher regexMatcher = regex.matcher(subjectString);
    foundMatch = regexMatcher.find();
    //Relace the found text with whatever you want
} catch (PatternSyntaxException ex) {
    // Syntax error in the regular expression
}
于 2013-01-28T18:29:16.943 に答える
1

ここでは、より単純なソリューションをお勧めします。ところで、オフセットとカウントを無視しました。以下の解決策は、元の配列を上書きします。

public void write(byte[] bytes, int offset, int count) {
    int writtenI = offset;
    for (int readI = offset; readI < offset + count; ++readI) {
        byte b = bytes[readI];
        if (32 <= b && b < 127) {
            // ASCII printable:
            bytes[writtenI] = bytes[readI]; // writtenI <= readI
            ++writtenI;
        }
    }
    byte[] bytes2 = new byte[writtenI - offset];
    System.arraycopy(bytes, offset, bytes2, 0, writtenI - offset);
    //String str = new String(bytes, offset, writtenI - offset, "ASCII");
    //bytes2 = str.getBytes("ASCII");
    GraphicsTerminalActivity.sendOverSerial(bytes2);
}
于 2013-01-28T19:09:33.467 に答える