8

我希望从字符串中删除所有不可打印的 ascii 字符,同时保留不可见的字符。我认为这会起作用,因为空格 \n \r 是不可见字符但不是不可打印的?基本上我得到了一个带有�字符的字节数组,我不希望它们在其中。所以我试图将其转换为字符串,在再次将其用作字节数组之前删除�字符。

Space 现在在我的代码中可以正常工作,但是现在 \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;
 }

} 

编辑:我试过 [^\x00-\x7F] 这是 ascii 字符的范围....但是符号仍然通过,很奇怪。

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 回答