Java - 正则表达式替换字符串中的八进制值

时间:2017-05-23 13:20:31

标签: java regex ascii octal

我有一组八进制值说(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文件中执行此操作。

我们如何使用正则表达式来完成这项任务。

2 个答案:

答案 0 :(得分:1)

您可以使用此正则表达式[^\p{ASCII}]替换所有非ASCII字符:

a.replaceAll("[^\\p{ASCII}]", "?")

输出

sccce????????????????????????????erferferfer

您必须在十六进制中找到八进制字符的表示形式,link 0177\x7F表示,0377FF表示

对于您的情况,您可以使用:

a.replaceAll("[\\x7F-\\xFF]", "?")

Ideone demo

答案 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?