2

我将字节接收到一个方法中,我想通过串行发送它们,但我只想发送有效字节,(即 a-zA-Z0-9"!£$%^&*()-_=+),东西像那样,空格,换行符等。我只想过滤掉任何字符,例如带有重音符号或�的字符,以任意顺序和任意次数。

这样的事情会包括所有角色的|工作吗?

^[a-z|A-Z|0-9|\\s|-<other characters>]*

或者,正确的表达方式是什么?

因此,如果一个字符串包含“exit����”,我只想发送“exit”,绝不发送无效字符,而是发送其他所有字符。

public void write(byte[] bytes, int offset, int count) {
  String str;
  try {
    str = new String(bytes, "ASCII");
    Log.d(TAG, "data received in write: " +str );
    //^[a-z|A-Z|0-9|\s|-]*
    //test here, call next line on any character that is valid
    GraphicsTerminalActivity.sendOverSerial(str.getBytes("ASCII"));
  } catch (UnsupportedEncodingException e) {
    Log.d(TAG, "exception" );
    e.printStackTrace();
  }
  // appendToEmulator(bytes, 0, bytes.length);
}

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

4

4 回答 4

3

尝试使用像[\x20-\x7E]这些是可打印字符的 ASCII 代码这样的模式。

顺便说一句,我假设您在询问 ASCII,因为这是您解析问题的方式。

于 2013-01-25T17:07:57.243 回答
1

管道不是将字符列表转换为正则表达式的正确方法。将字符放在带有方括号的字符类中。默认情况下,字符类中的所有字符都是 ORed,因此不需要管道。需要转义不是数字和字母的符号。

[a-zA-Z0-9\"\!\£\$\%\^\&\*\(\)\-\_\=\+]

然后,如果您想将其放入 Java 字符串中,则需要对转义符进行双重转义

Pattern p = Pattern.compile("[a-zA-Z0-9\\"\\!\\£\\$\\%\\^\\&\\*\\(\\)\\-\\_\\=\\+]");

请记住,英镑符号 (£)不是ASCII 字符,因此将其转换为 ASCII 是行不通的。

于 2013-01-25T17:39:51.327 回答
1

你想做一个搜索替换:

String fixed = input.replaceAll("[^\p{Print}\t\n]", "");

罗尔夫

编辑:添加参考:

Pattern Javadoc -> 向下滚动到 POSIX Character Classes (US-ASCII ONLY)

上面的模式匹配所有不是可打印字符的字符......

于 2013-01-25T17:11:22.600 回答
1

如果您还没有,您可能想要查看 Java 的Normalizer类。它将允许您从其重音等效项中提取“正常”字符,作为丢弃整个字符的替代方法。

我不记得这个想法的确切来源(我最近试图进行与口音无关的搜索),但快速搜索发现了这篇简单的博客文章,它可能会提供更多关于如何使用它的见解。

于 2013-01-25T17:29:00.033 回答