Java - 用于替换字符串中的八进制值的正则表达式
Java - Regex to replace Octal value in string
我有一组八进制值,比如 (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 文件中执行此操作。
我们如何使用正则表达式来完成这个任务。
您可以使用此正则表达式 [^\p{ASCII}]
,它会替换所有非 ASCII
字符:
a.replaceAll("[^\p{ASCII}]", "?")
输出:
sccce????????????????????????????erferferfer
你要找到八进制字符在Hexadecimal中的表示,从link 0177
is represented by \x7F
and 0377
is represented by FF
对于您的情况,您可以使用:
a.replaceAll("[\x7F-\xFF]", "?")
您不想一次对整个文件执行此操作 - 您需要一种流式处理方法。我会这样做:
// 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);
}
}
因此,您将为当前文件打开一个 reader(具有适当的编码),为输出文件打开一个编写器(具有适当的编码),然后调用上面的方法。它会一次读取一块数据,替换块中的所有 "bad" 个字符,然后将块写出到写入器。
不需要正则表达式。
请注意,在该范围之外还有很多非 ASCII 字符 - 如果您真的想删除所有非 ASCII 字符,您基本上需要
if (buffer[i] > 126) // Or 127; what do you want to do with U+007F?
我有一组八进制值,比如 (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 文件中执行此操作。
我们如何使用正则表达式来完成这个任务。
您可以使用此正则表达式 [^\p{ASCII}]
,它会替换所有非 ASCII
字符:
a.replaceAll("[^\p{ASCII}]", "?")
输出:
sccce????????????????????????????erferferfer
你要找到八进制字符在Hexadecimal中的表示,从link 0177
is represented by \x7F
and 0377
is represented by FF
对于您的情况,您可以使用:
a.replaceAll("[\x7F-\xFF]", "?")
您不想一次对整个文件执行此操作 - 您需要一种流式处理方法。我会这样做:
// 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);
}
}
因此,您将为当前文件打开一个 reader(具有适当的编码),为输出文件打开一个编写器(具有适当的编码),然后调用上面的方法。它会一次读取一块数据,替换块中的所有 "bad" 个字符,然后将块写出到写入器。
不需要正则表达式。
请注意,在该范围之外还有很多非 ASCII 字符 - 如果您真的想删除所有非 ASCII 字符,您基本上需要
if (buffer[i] > 126) // Or 127; what do you want to do with U+007F?