Java 用于删除所有不可打印字符的正则表达式

Java 用于删除所有不可打印字符的正则表达式,java,android,regex,Java,Android,Regex,我希望从字符串中删除所有不可打印的ascii字符,同时保留不可见的字符。我认为这会起作用,因为空白\n\r是不可见字符,但不可打印? 基本上,我得到了一个字节数组� 角色在里面,我不想让他们在里面。因此,我试图将其转换为字符串,删除� 再次将其用作字节数组之前的字符 空格现在在我的代码中可以正常工作,但是现在\r\n和\n不起作用。什么是正确的正则表达式来保留这些呢?还是有更好的方法来解决我的问题 public void write(byte[] bytes, int offset, int c

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

空格现在在我的代码中可以正常工作,但是现在\r\n和\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字符的范围……但是� 符号仍然可以通过,很奇怪。

以下正则表达式将只匹配可打印文本

[^\x00\x08\x0B\x0C\x0E-\x1F]*
以下正则表达式将查找不可打印的字符

[\x00\x08\x0B\x0C\x0E-\x1F]
Jave代码:

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
}

在这里,我更喜欢一个更简单的解决方案。顺便说一句,您忽略了偏移量和计数。下面的解决方案将覆盖原始阵列

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);
}
公共无效写入(字节[]字节,整数偏移量,整数计数){
int writeni=偏移量;
for(int readI=offset;readIif(32)不要在正则表达式中使用\\t和\\n。正常使用它们\t\n因为没有像\w\d\s这样的正则表达式字符类。这些字符可能不是不可打印的字符,而是(Unicode)您的字体不支持的字符。请提供一个示例字符串,可能也通过
od-t u1
传输。好的,我已经停止使用\\t\\n,出现了相同的功能。@Ranon是的,我相信这些字符是unicode字符,这是我在终端仿真器中键入任何字符时收到的字符,例如我得到一串“g”���\r\n“因此我想删除�. 我认为这些代码是\uFFFd。我的语句正确地删除了这些代码,但我需要保留的\r\n和\b也是如此。我发现java.lang.Character提供了字符过滤所需的所有功能。也许你根本不需要正则表达式。我已经为各种垃圾字符实现了一个字符过滤器,可以et粘贴在word用户的文本区域中,除此类之外不需要任何其他内容。谢谢我尝试一下,不幸的是,我的测试电缆断了,一周内无法尝试。当您说//ASCII可打印:这是您得到的唯一ASCII可打印字符吗?我需要某些不可打印的字符,例如\r\n\b.F或实例[^\x00-\x7F]允许所有内容通过,但\p{print}会停止\n\r\b以及不正确的字符。因此,对我来说,这不是忽略所有不可打印的字符的情况。您可以将其更改为
0是的,这样更好,但出于某种原因�  字符可以通过。我不知道为什么。我必须做更多的测试,看看哪些范围可以消除它们,哪些不可以…谢谢。我需要某些不可打印的字符来通过,例如\r\n\b。但是我需要删除其他导致错误的不可打印字符� 例如[^\x00-\x7F]允许所有内容通过,但\p{print}会停止\n\r\b以及不正确的字符