删除 java 中 X charCode 以上的字符

Removing characters above X charCode in java

在Java中,我可以这样替换基于字符代码的字符:

String text = "";
text = text.replaceAll(String.valueOf((char)61443), " ");

但是,给定一行具有不同字符代码的无意义字符,删除它们的最有效方法是什么?例如,下面的行有许多不同的字符代码,但它们都在 60000 以上。是否有办法删除所有超过 60000 的字符代码而不循环遍历每个字符,或者列出 60000 到 70000?



屏幕上是这样的,实际符号会有所不同 你需要这样的东西 /^a-zA-Z0-9/

text = text.replaceAll("^a-zA-Z0-9", " ");

使用具有范围字符的正则表达式 class。因为您指定了一个“到 70000”的范围,它在 UTF-16 之外,其最大值为 \uFFFF 或 65535,因此您需要范围的结尾为 surrogate pair,其最大值为 \uDBFF\uDFFF,解码为 10FFFF 十六进制或 1114111 十进制:

text = text.replaceAll("[\uEA60-\uDBFF\uDFFF]+", "");

仅供参考 EA6060000 的十六进制。

另请注意用 空白 代替 space,以 删除他们。

顺便说一句,如果您的字面意思是 高于 60000 而不是 60000 或更高 .

,请使用 EA61

中的正则表达式当然更简洁,但这里还有一种处理流的方法。也许它会对某人有用。也许在某些情况下它更快,谁知道呢。

如果你想去除任何大于65535的逻辑字符(你在问题中说的是60k-70k),那么你需要考虑代码点。

这演示了一个包含逻辑字符 '' 的字符串。根据字体的不同,它可能是不可见的,但它看起来像这样:

final String newStr = "\uD9C0\uDC00".codePoints()
        .filter(chr -> chr <= 60_000 /*&& chr <= 70_000*/)
        .collect(
            StringBuilder::new,
            (sb, chr) -> sb.append((char) chr),
            StringBuilder::append
        )
        .toString();
System.out.println(newStr);

输出为空字符串。