首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从Java字符串中删除✅,,✈,♛和其他类似的表情/图像/符号

从Java字符串中删除✅,,✈,♛和其他类似的表情/图像/符号
EN

Stack Overflow用户
提问于 2018-03-27 10:05:45
回答 7查看 43.8K关注 0票数 208

我有一些字符串,里面有各种不同的表情/图像/符号。

并不是所有的字符串都用英语--其中一些是用其他非拉丁语言,例如:

代码语言:javascript
复制
▓ 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.❉

...and还有很多这样的东西。

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

我试着用EmojiParser库来清理标志

代码语言:javascript
复制
String withoutEmojis = EmojiParser.removeAllEmojis(input);

问题是EmojiParser无法移除大部分的标志。♦标志是我发现的唯一一个,直到现在它已经被移除了。其他符号(如✪❉★✰❈❧✂❋r✿♛)不被移除。

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

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2018-03-27 14:46:45

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

代码语言:javascript
复制
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]是一个范围,表示所有数字(\\p{N})、字母(\\p{L})、标记(\\p{M})、标点符号(\\p{P})、空格/分隔符(\\p{Z})、其他格式(\\p{Cf})以及在U+FFFF上的Unicode (\\p{Cs})和换行符(\\s)中的其他字符。\\p{L} specifically包括其他字母中的字符,如西里尔字母、拉丁字母、汉字等。
  • regex字符集中的^否定匹配。

示例:

代码语言:javascript
复制
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 _# 皆さん、こんにちは! 私はジョンと申します。"

如果您需要更多信息,请查看文档中的regexes。

票数 311
EN

Stack Overflow用户

发布于 2018-03-27 17:56:59

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

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

代码语言:javascript
复制
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,我在上面的类别白名单中没有包括这个类别。)

票数 83
EN

Stack Overflow用户

发布于 2018-03-27 10:10:46

基于Emoji完整列表,v11.0,您需要删除1644个不同的Unicode代码点。例如,作为U+2705在此列表中。

拥有完整的表情列表,您需要使用码点过滤掉它们。迭代单个charbyte不能工作,因为单个代码点可以跨越多个字节。因为Java使用UTF-16表情符号,所以通常需要两个char

代码语言:javascript
复制
String input = "ab✅cd";
for (int i = 0; i < input.length();) {
  int cp = input.codePointAt(i);
  // filter out if matches
  i += Character.charCount(cp); 
}

从Unicode代码点U+2705到Java int的映射非常简单:

代码语言:javascript
复制
int viSign = 0x2705;

或者因为Java支持Unicode字符串:

代码语言:javascript
复制
int viSign = "✅".codePointAt(0);
票数 49
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49510006

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档