我有一些字符串,里面有各种不同的表情/图像/符号。
并不是所有的字符串都用英语--其中一些是用其他非拉丁语言,例如:
▓ 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库来清理标志
String withoutEmojis = EmojiParser.removeAllEmojis(input);问题是EmojiParser无法移除大部分的标志。♦标志是我发现的唯一一个,直到现在它已经被移除了。其他符号(如✪❉★✰❈❧✂❋r✿♛)不被移除。
是否有办法从输入字符串中删除所有这些符号,并仅保留不同语言中的字母和标点符号?
发布于 2018-03-27 14:46:45
与其将某些元素列入黑名单,不如创建一个您希望保留的字符的白名单如何?这样你就不用担心每一个新的表情符号都被添加了。
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包括其他字母中的字符,如西里尔字母、拉丁字母、汉字等。^否定匹配。示例:
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。
发布于 2018-03-27 17:56:59
我不是很喜欢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,我在上面的类别白名单中没有包括这个类别。)
发布于 2018-03-27 10:10:46
基于Emoji完整列表,v11.0,您需要删除1644个不同的Unicode代码点。例如,✅作为U+2705在此列表中。
拥有完整的表情列表,您需要使用码点过滤掉它们。迭代单个char或byte不能工作,因为单个代码点可以跨越多个字节。因为Java使用UTF-16表情符号,所以通常需要两个char。
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的映射非常简单:
int viSign = 0x2705;或者因为Java支持Unicode字符串:
int viSign = "✅".codePointAt(0);https://stackoverflow.com/questions/49510006
复制相似问题