【问题标题】:Java - Regex to replace Octal value in stringJava - 正则表达式替换字符串中的八进制值
【发布时间】:2017-10-23 11:31:59
【问题描述】:

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

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

【问题讨论】:

  • 文字“177”和“377”不是八进制文字 - 它们是十进制文字。如果您想要八进制值,请使用 0177 和 0377。也不清楚为什么您认为正则表达式是这里的解决方案...
  • 这种情况的最佳解决方案是什么?
  • 好吧,我会使用Reader,一次读取一大块文本(进入 char 数组),然后遍历 char 数组,替换该范围内的任何值,然后写入该块发送到Writer。重复直到你读完文件中的所有内容。
  • 正则表达式也使用循环。目前尚不清楚您要解决什么问题。您想替换八进制数,但您正在将其转换为字符。目前尚不清楚您是否只有 ASCII 或整个 UTF 字符集。你的问题有很多不清楚/错误的地方,我很头疼。如果要替换八进制字符串,请清楚地重写?或者只是在八进制数中具有给定位置的 Unicode 字符。

标签: java regex ascii octal


【解决方案1】:

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

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

输出:

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

你必须找到八进制字符的十六进制表示,从link0177\x7F表示,0377FF表示

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

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

Ideone demo

【讨论】:

  • 我想,我正在寻找同样的方法。你能解释一下[^\\p{ASCII}]的具体功能吗?
  • @Ajay 这将替换所有非 ASCII 字符
  • 有什么方法可以替换特定的八进制值。
  • @Ajay 你想用什么来代替你想得到什么?
  • 我想用 ? 替换 0177-0377 的八进制值范围正如我在问题中提到的
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2014-08-25
    • 1970-01-01
    • 2016-04-17
    • 2010-10-04
    • 2018-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-04
    相关资源
    最近更新 更多