任何字母,数字和“正常”字符的正则表达式

时间:2013-01-25 16:58:23

标签: java android regex

我在一个方法中接收字节,我想通过串口发送它们,但我只想发送有效字节,(即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 个答案:

答案 0 :(得分:2)

尝试使用[\x20-\x7E]之类的模式。这些是the printable characters的ASCII代码。

顺便说一下,我假设你问的是ASCII,因为这是你在解决问题时的方式。

答案 1 :(得分:1)

您想要进行搜索替换:

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

罗尔夫

编辑:添加引用:

Pattern Javadoc - &gt;向下滚动到POSIX字符类(仅限US-ASCII)

上面的模式匹配可打印字符....

的所有字符

答案 2 :(得分:1)

如果您还没有,可能需要查看Java的Normalizer课程。它允许你从其重音等效词中提取“普通”字符,作为丢弃整个字符的替代方法。

我不记得我对这个想法的确切来源(我最近尝试进行了与口音无关的搜索),但是快速搜索了this simple blog post,可以更深入地了解如何使用它

答案 3 :(得分:1)

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

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

然后如果你想把它放到Java字符串中,你需要双重逃避转义

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

请记住,井号(£)是不是的ASCII字符,因此将其转换为ASCII无效。