删除 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]+", "");
仅供参考 EA60
是 60000
的十六进制。
另请注意用 空白 代替 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);
输出为空字符串。
在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]+", "");
仅供参考 EA60
是 60000
的十六进制。
另请注意用 空白 代替 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);
输出为空字符串。