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]", "?")

Ideone demo

您不想一次对整个文件执行此操作 - 您需要一种流式处理方法。我会这样做:

// 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?