从 Java 字符串中删除 ✅、🔥、✈、♛ 和其他此类表情符号/图像/符号

新手上路,请多包涵

我有一些字符串,其中包含各种不同的表情符号/图像/符号。

并非所有字符串都是英文的——其中一些字符串是其他非拉丁语,例如:

 ▓ railway??
→ Cats and dogs
I'm on 🔥
Apples ⚛
✅ Vi sign
♛ I'm the king ♛
Corée ♦ du Nord ☁  (French)
 gjør at både ◄╗ (Norwegian)
Star me ★
Star ⭐ once more
早上好 ♛ (Chinese)
Καλημέρα ✂ (Greek)
another ✓ sign ✓
добрай раніцы ✪ (Belarus)
◄ शुभ प्रभात ◄ (Hindi)
✪ ✰ ❈ ❧ Let's get together ★. We shall meet at 12/10/2018 10:00 AM at Tony's.❉

……还有更多。

我想摆脱所有这些标志/图像,只保留不同语言的字母(和标点符号)。

我尝试使用 EmojiParser 库 清理标志:

 String withoutEmojis = EmojiParser.removeAllEmojis(input);

问题是 EmojiParser 无法删除大部分符号。 ♦ 标志是迄今为止我发现的唯一一个被删除的标志。其他标志如 ✪ ❉ ★ ✰ ❈ ❧ ✂ ❋ ⓡ ✿ ♛ 🔥 没有被删除。

有没有办法从输入字符串中删除所有这些符号,只保留 不同语言 的字母和标点符号?

原文由 riorio 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

与其将某些元素列入黑名单,不如创建一个你希望保留的字符的白名单怎么样?这样您就不必担心每个新的表情符号都会被添加。

 String characterFilter = "[^\\p{L}\\p{M}\\p{N}\\p{P}\\p{Z}\\p{Cf}\\p{Cs}\\s]";
String emotionless = aString.replaceAll(characterFilter,"");

所以:

  • [\\p{L}\\p{M}\\p{N}\\p{P}\\p{Z}\\p{Cf}\\p{Cs}\\s] is a range representing all numeric ( \\p{N} ), letter ( \\p{L} ), mark ( \\p{M} ), punctuation ( \\p{P} ), whitespace/separator ( \\p{Z} ), other formatting ( \\p{Cf} ) and other characters above U+FFFF in Unicode ( \\p{Cs} ) 和换行符 ( \\s ) 字符。 \\p{L} 具体 包括来自其他字母表的字符,如西里尔字母、拉丁字母、汉字等。
  • 正则表达式字符集中的 ^ 否定匹配。

例子:

 String str = "hello world _# 皆さん、こんにちは! 私はジョンと申します。🔥";
System.out.print(str.replaceAll("[^\\p{L}\\p{M}\\p{N}\\p{P}\\p{Z}\\p{Cf}\\p{Cs}\\s]",""));
// Output:
//   "hello world _# 皆さん、こんにちは! 私はジョンと申します。"

如果您需要更多信息,请查看有关正则表达式的 Java 文档

原文由 Nick Bull 发布,翻译遵循 CC BY-SA 3.0 许可协议

我不是很喜欢 Java,所以我不会尝试编写内联示例代码,但我这样做的方法是检查 Unicode 对每个字符的“一般类别”的称呼。有几个字母和标点符号类别。

您可以使用 Character.getType 查找给定字符的一般类别。您可能应该保留属于这些一般类别的那些字符:

 COMBINING_SPACING_MARK
CONNECTOR_PUNCTUATION
CURRENCY_SYMBOL
DASH_PUNCTUATION
DECIMAL_DIGIT_NUMBER
ENCLOSING_MARK
END_PUNCTUATION
FINAL_QUOTE_PUNCTUATION
FORMAT
INITIAL_QUOTE_PUNCTUATION
LETTER_NUMBER
LINE_SEPARATOR
LOWERCASE_LETTER
MATH_SYMBOL
MODIFIER_LETTER
MODIFIER_SYMBOL
NON_SPACING_MARK
OTHER_LETTER
OTHER_NUMBER
OTHER_PUNCTUATION
PARAGRAPH_SEPARATOR
SPACE_SEPARATOR
START_PUNCTUATION
TITLECASE_LETTER
UPPERCASE_LETTER

(您列为特别要删除的所有字符都具有一般类别 OTHER_SYMBOL ,我没有将其包含在上述类别白名单中。)

原文由 Daniel Wagner 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题