【问题标题】:Java remove non Latin-basic characters from stringJava从字符串中删除非拉丁基本字符
【发布时间】:2016-03-16 14:40:10
【问题描述】:

假设我有以下代码:

String description = "★★★★★  ♫ ♬ This description ✔✔  ▬ █ ✖  is a mess. ♫ ♬ ★★★★★";

我想删除非拉丁字符:

让它变成这样:This description is a mess.

我知道可能有很多类似wingdings 的字符,所以与其指定我要删除的内容,我认为最好列出我要保留的内容:Basic LatinLatin-1 supplements 字符。

我发现我可以使用以下代码删除除基本拉丁字符以外的所有内容

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

但是有没有办法同时保留 Latin-1 补充字符?

【问题讨论】:

  • 因为看起来该范围正好在基本拉丁语之后,您不能将正则表达式更改为:"[^\\x00-\\xFF]"
  • @resueman 这听起来像是一个答案...
  • 试试\p{S}正则表达式,看我下面的帖子
  • @Saleem 评论回答?

标签: java regex unicode


【解决方案1】:

从您提供的字符范围来看,“Basic Latin”和“Latin-1 Supplements”似乎是相邻的(0x00-0x7F0x80-0xFF)。

因此您可以使用您提供的相同正则表达式,只是扩展为包含“Latin-1 Supplement”字符。看起来像这样:

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

正如Quinn 在 cmets 中指出的那样,这不会消除已删除部分之间的空格,因此结果会有多余的空格(可能是也可能不是您想要的)。如果您想删除这些空格,Quinn 的正则表达式([^(\\x00-\\xFF)]+(?:$|\\s*),以防评论被删除)可能适合您。

【讨论】:

  • 结果字符串的单词之间有更多的空格。这是 OP 想要的格式吗?建议使用[^(\\x00-\\xFF)]+(?:$|\\s*),去掉trim()
【解决方案2】:

如果您想要一个更具描述性的表达方式,请使用:

description.replaceAll( "[^\\p{InBasic_Latin}\\p{InLatin-1Supplement}]", "" );

或否定的交集[\P{InBasic_Latin}&&\P{InLatin-1Supplement}](不是说它更具可读性;))

【讨论】:

  • 我已经测试了所有答案,似乎这是唯一真正保留了 $ 字符(它是 Latin-1 补充字符的一部分)的答案。
  • @RoboticR 使用 [^\x00-\xFF] 会做同样的事情。
  • 有没有办法用 latin-1 补充替换 latin-basic?
  • @tree 正则表达式不提供重新映射基于字符的字符类的方法。有一种方法可以替换可能用于此类事情的单个组,但这会变得非常复杂并且可能不是最佳解决方案。相反,您可能想要使用一个普通的旧循环并一个接一个地替换字符。无论如何应该如何映射这些? A 会映射到 ÀÁÂ 等吗?
猜你喜欢
  • 1970-01-01
  • 2014-05-31
  • 1970-01-01
  • 2015-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-24
相关资源
最近更新 更多