我在一个方法中接收字节,我想通过串口发送它们,但我只想发送有效字节,(即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字符的范围....但是 符号仍然通过,很奇怪。
答案 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无效。