Java从字符串中删除非拉丁基本字符

8
假设我有以下代码:
String description = "★★★★★  ♫ ♬ This description ✔✔  ▬ █ ✖  is a mess. ♫ ♬ ★★★★★";

我想移除非拉丁字符:

使其变为:这个描述很乱。

我知道可能有很多类似 Wingdings 的字符,所以我认为更好的做法是列出我想要保留的内容:基本拉丁字符拉丁-1 补充字符

我发现可以使用以下代码来移除除基本拉丁字符外的所有字符:

String clean_description = description.replaceAll("[^\\x00-\\x7F]", "").trim();

但是否有一种方法也可以保留拉丁-1补充字符呢?


3
因为它看起来该范围紧随基本拉丁字符之后,所以您能否将正则表达式更改为"[^\\x00-\\xFF]" - resueman
@resueman 这听起来像是一个答案... - Thomas Ayoub
尝试使用\p{S}正则表达式,参见我下面的帖子。 - Saleem
@Saleem 评论 回答? - Thomas Ayoub
2个回答

8
从您提供的字符范围来看,"Basic Latin(基本拉丁文)"和"Latin-1 Supplements(拉丁字母补充-1)"是相邻的(0x00-0x7F0x80-0xFF)。
因此您可以使用您提供的相同正则表达式,只需扩展包括"Latin-1 Supplement(拉丁字母补充-1)"字符。这将如下所示:
String clean_description = description.replaceAll("[^\\x00-\\xFF]", "").trim();

正如Quinn在评论中指出的那样,这种方法并不能去除移除部分之间的空格,因此结果会有多余的空格(可能是您想要的,也可能不是)。如果您想要去除这些空格,则可以使用Quinn提供的正则表达式([^(\\x00-\\xFF)]+(?:$|\\s*),如果评论被删除)。


1
结果字符串中单词之间有更多的空格。这是OP想要的格式吗?建议使用[^(\\x00-\\xFF)]+(?:$|\\s*),并且去掉trim() - Quinn

5
如果您希望表达更加详细,请使用以下内容:
description.replaceAll( "[^\\p{InBasic_Latin}\\p{InLatin-1Supplement}]", "" );

或者是否定的交集[\P{InBasic_Latin}&&\P{InLatin-1Supplement}](并不是更易读 ;) )

我已经测试了所有的答案,似乎这是唯一一个实际保留了“$”字符(它是Latin-1补充字符集的一部分)的答案。 - RoboticR
@RoboticR 使用 [^\x00-\xFF] 也可以实现相同的功能。 - Thomas
有没有一种方法可以将拉丁基本字符替换为拉丁-1补充字符集? - tree
@tree 正则表达式不提供基于字符类别重新映射字符的方法。虽然有一种替换单个组的方法,但这可能会变得非常复杂,而且可能不是最佳解决方案。相反,您可能希望使用一个简单的循环,逐个替换字符。那么这些应该如何映射呢?A 应该映射到 ÀÁÂ 等吗? - Thomas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接