有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java正则表达式以删除所有不可打印字符

我希望从字符串中删除所有不可打印的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字符的范围。。。。但是后来� 奇怪的是,符号仍然可以通过


共 (2) 个答案

  1. # 1 楼答案

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

    [^\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
    }
    
  2. # 2 楼答案

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

    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);
    }