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