我有一组八进制值说(0177-0377)。每当我在字符串中找到这些值时,必须用?替换。
String a= "sccce¼»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕerferferfer";
for (int i = 0177; i<= 0377 ; i++)
{
char x= (char) i;
a= a.replaceAll(Character.toString(x), "?");
}
System.out.print(a);
但是当我们有一个小文件时这看起来不错,但我必须在1TB文件中执行此操作。
我们如何使用正则表达式来完成这项任务。
答案 0 :(得分:1)
您可以使用此正则表达式[^\p{ASCII}]
替换所有非ASCII
字符:
a.replaceAll("[^\\p{ASCII}]", "?")
输出
sccce????????????????????????????erferferfer
您必须在十六进制中找到八进制字符的表示形式,link 0177
由\x7F
表示,0377
由FF
表示
对于您的情况,您可以使用:
a.replaceAll("[\\x7F-\\xFF]", "?")
答案 1 :(得分:1)
您不希望一次性对整个文件执行此操作 - 您需要一种流式处理方法。我会做这样的事情:
// TODO: Rename to something more appropriate
public static void replaceInvalidCharacters(Reader reader, Writer writer) {
char[] buffer = new char[16384]; // Adjust if you want
int charsRead;
while ((charsRead = reader.read(buffer)) > 0) {
for (int i = 0; i < charsRead; i++) {
if (buffer[i] >= 0177 && buffer[i] <= 0377) {
buffer[i] = '?';
}
}
writer.write(buffer);
}
}
因此,您要打开当前文件的阅读器(使用适当的编码),输出文件的编写器(具有适当的编码),然后调用上面的方法。它将一次读取一大块数据,替换块中的所有“坏”字符,然后将块写入编写器。
不需要正则表达式。
请注意,在该范围之外有很多非ASCII字符 - 如果你真的想删除所有非ASCII字符,你基本上想要
if (buffer[i] > 126) // Or 127; what do you want to do with U+007F?