热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《从Java字符串中删除✅,,✈,♛和其他此类表情符号/图像/符号》经验,为你挑选了5个好方法。

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

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

? 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无法删除大部分迹象.♦标志是我发现的唯一一个被删除的标志.其他标志如✪✪★✰❈❧✂❋ⓡ♛♛不会被删除.

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



1> Nick Bull..:

而不是将某些元素列入黑名单,如何创建您希望保留的角色的白名单?这样您就不必担心每个新的表情符号都会被添加.

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]是一个范围,表示所有numeric(\\p{N}),letter(\\p{L}),mark(\\p{M}),标点符号(\\p{P}),空格/分隔符(\\p{Z}),其他格式(\\p{Cf})以及U+FFFFUnicode(\\p{Cs})和newline(\\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 文档.


@Chris伟大的标点正则表达式的例子,对于某些情况看起来足够广泛.也许人们不会阅读整个答案 - **如答案底部所述,`p {L}`处理非英语字母字符**.我希望我能理解的是,我不能在我的答案中广泛列出每一个非英语字母表,因为这样做是不切实际的.
这个.谢谢,麻烦您了.不要试图*禁止导致你出问题的*字符; 决定你*允许的字符*并对其进行编码.然后您的代码有一组明确定义的测试用例.
ASCII字母数字字符和表情符号之间的明显差异是重点和非拉丁字母.如果没有OP的输入,我们不知道这是否是一个好的答案(不过我的DV)
是的,我很好奇为什么这可能会被投票.第二个我看到这个问题,一个正则表达式是我想到的绝对第一件事(PS,因为他正在寻找标准字符和标点符号,我会使用类似`[^\w\^\ - \[\]\.!@#$%&*\(\)/ +'":;〜?,]``但这只是我健壮并且尝试收集所有非符号的典型字符.)Upvoted因为这绝对是一个潜在的解决方案如果他想添加一些其他语言字符,他可以根据需要将它们添加到表达式中.
我建议``[^ \\ p {L} \\ p {M} \\ p {N} \\ p {P} \\ p {Z} \\ p {Cf} \\ s]"`.这允许常规类别字母,标记,数字,标点符号,分隔符和"其他,格式",以及空白字符,如制表符和换行符.

2> Daniel Wagne..:

我不是超级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,我没有在上面的类别列入白名单.)


这是面向未来的答案.无论Unicode标准的未来更新如何,包括/排除基于其类别的字符意味着不需要单独解析字符和维护列表.当然,应该对不同语言(例如中文,阿拉伯语等)的文本进行粗略测试,以确保过滤的类别与目标环境中允许的文本相匹配.
哦,我昨天应该想到的另一个问题:TAB,CR和LF都是通用类别Cc(Java的CONTROL).那些需要特别列入白名单,因为你几乎肯定_don't_想要允许大多数遗留控制角色.

3> Karol Dowbec..:

基于完整的表情符号列表,v11.0,您有1644个不同的Unicode代码点要删除.例如?,在此列表中U+2705.

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

String input = "ab?cd";
for (int i = 0; i 

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

int viSign = 0x2705;

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

int viSign = "?".codePointAt(0);


这基本上与EmojiParser使用的方法相同,并且很快就会出于同样的原因而失败.新的表情符号相对频繁地添加到Unicode字符数据库中,如果您现在使用当前定义的1644表情符号实现负规则集的解决方案,则只要新的表情符号可用,实现就会失败.
非常有用的清单.有趣的是,名为removeAllEmojis的方法称为EmojiParser的东西无法处理这些...... :-)
@Bergi:不,因为`input.codePointAt`最多只能查看2个字符,这是一个不变的上限.另外(新添加的)`i + = Character.charCount(cp)`跳过`input.codePointAt`检查过的所有字符(在某些极端情况下减去1).
@OlivierGrégoire:`String.chars()`流过字符而不是代码点.有一个单独的方法[`String.codePoints()`](https://docs.oracle.com/javase/10/docs/api/java/lang/String.html#codePoints()).
这里至少有两个问题:你使用的是一个"封闭的"表情符号列表,所以每年你都要扩展它(但这可能不容易解决),这段代码可能无法正常使用代码点序列(参见https://unicode.org/Public/emoji/11.0/emoji-zwj-sequences.txt)
这将使孤立的零宽度连接器乱丢你的琴弦.
`codePointAt`可能是线性时间,所以整个循环会有二次复杂度?
@TJCrowder因为[他们不是表情符号(根据Unicode标准)](/sf/ask/17360801/#comment86032854_49510006)
这个答案似乎与目前的工作解决方案相差甚远.将所有表情符号收集到适当的格式并非易事.

4> Daniel F..:

ICU4J是你的朋友.

UCharacter.hasBinaryProperty(UProperty.EMOJI);

请记住保持您的icu4j版本是最新的,请注意这只会过滤掉官方的Unicode表情符号,而不是符号字符.结合并根据需要过滤掉其他字符类型.

更多信息:http: //icu-project.org/apiref/icu4j/com/ibm/icu/lang/UProperty.html#EMOJI



5> Marcos Zolno..:

我在下面给出了一些例子,并认为拉丁语已经足够了,但......

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

在编辑之后,使用该Character.getType方法开发了一种新的解决方案,这似乎是最好的解决方案.

package zmarcos.emoji;

import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

public class TestEmoji {

    public static void main(String[] args) {
        String[] arr = {"Remove ?, , ? , ? and other such signs from Java string",
            "? Cats and dogs",
            "I'm on ",
            "Apples ? ",
            "? Vi sign",
            "? I'm the king ? ",
            "Star me ?",
            "Star ? once more",
            "??? ?",
            "???????? ?"};
        System.out.println("---only letters and spaces alike---\n");
        for (String input : arr) {
            int[] filtered = input.codePoints().filter((cp) -> Character.isLetter(cp) || Character.isWhitespace(cp)).toArray();
            String result = new String(filtered, 0, filtered.length);
            System.out.println(input);
            System.out.println(result);
        }

        System.out.println("\n---unicode blocks white---\n");
        Set whiteList = new HashSet<>();
        whiteList.add(Character.UnicodeBlock.BASIC_LATIN);
        for (String input : arr) {
            int[] filtered = input.codePoints().filter((cp) -> whiteList.contains(Character.UnicodeBlock.of(cp))).toArray();
            String result = new String(filtered, 0, filtered.length);
            System.out.println(input);
            System.out.println(result);
        }

        System.out.println("\n---unicode blocks black---\n");
        Set blackList = new HashSet<>();        
        blackList.add(Character.UnicodeBlock.EMOTICONS);
        blackList.add(Character.UnicodeBlock.MISCELLANEOUS_TECHNICAL);
        blackList.add(Character.UnicodeBlock.MISCELLANEOUS_SYMBOLS);
        blackList.add(Character.UnicodeBlock.MISCELLANEOUS_SYMBOLS_AND_ARROWS);
        blackList.add(Character.UnicodeBlock.MISCELLANEOUS_SYMBOLS_AND_PICTOGRAPHS);
        blackList.add(Character.UnicodeBlock.ALCHEMICAL_SYMBOLS);
        blackList.add(Character.UnicodeBlock.TRANSPORT_AND_MAP_SYMBOLS);
        blackList.add(Character.UnicodeBlock.GEOMETRIC_SHAPES);
        blackList.add(Character.UnicodeBlock.DINGBATS);
        for (String input : arr) {
            int[] filtered = input.codePoints().filter((cp) -> !blackList.contains(Character.UnicodeBlock.of(cp))).toArray();
            String result = new String(filtered, 0, filtered.length);
            System.out.println(input);
            System.out.println(result);
        }
        System.out.println("\n---category---\n");
        int[] category = {Character.COMBINING_SPACING_MARK, Character.COMBINING_SPACING_MARK, Character.CONNECTOR_PUNCTUATION, /*Character.CONTROL,*/ Character.CURRENCY_SYMBOL,
            Character.DASH_PUNCTUATION, Character.DECIMAL_DIGIT_NUMBER, Character.ENCLOSING_MARK, Character.END_PUNCTUATION, Character.FINAL_QUOTE_PUNCTUATION,
            /*Character.FORMAT,*/ Character.INITIAL_QUOTE_PUNCTUATION, Character.LETTER_NUMBER, Character.LINE_SEPARATOR, Character.LOWERCASE_LETTER,
            /*Character.MATH_SYMBOL,*/ Character.MODIFIER_LETTER, /*Character.MODIFIER_SYMBOL,*/ Character.NON_SPACING_MARK, Character.OTHER_LETTER, Character.OTHER_NUMBER,
            Character.OTHER_PUNCTUATION, /*Character.OTHER_SYMBOL,*/ Character.PARAGRAPH_SEPARATOR, /*Character.PRIVATE_USE,*/
            Character.SPACE_SEPARATOR, Character.START_PUNCTUATION, /*Character.SURROGATE,*/ Character.TITLECASE_LETTER, /*Character.UNASSIGNED,*/ Character.UPPERCASE_LETTER};
        Arrays.sort(category);
        for (String input : arr) {
            int[] filtered = input.codePoints().filter((cp) -> Arrays.binarySearch(category, Character.getType(cp)) >= 0).toArray();
            String result = new String(filtered, 0, filtered.length);
            System.out.println(input);
            System.out.println(result);
        }
    }

}

输出:

---only letters and spaces alike---

Remove ?, , ? , ? and other such signs from Java string
Remove      and other such signs from Java string
? Cats and dogs
 Cats and dogs
I'm on 
Im on 
Apples ? 
Apples  
? Vi sign
 Vi sign
? I'm the king ? 
 Im the king  
Star me ?
Star me 
Star ? once more
Star  once more
??? ?
??? 
???????? ?
???????? 

---unicode blocks white---

Remove ?, , ? , ? and other such signs from Java string
Remove , ,  ,  and other such signs from Java string
? Cats and dogs
 Cats and dogs
I'm on 
I'm on 
Apples ? 
Apples  
? Vi sign
 Vi sign
? I'm the king ? 
 I'm the king  
Star me ?
Star me 
Star ? once more
Star  once more
??? ?

???????? ?


---unicode blocks black---

Remove ?, , ? , ? and other such signs from Java string
Remove , ,  ,  and other such signs from Java string
? Cats and dogs
? Cats and dogs
I'm on 
I'm on 
Apples ? 
Apples  
? Vi sign
 Vi sign
? I'm the king ? 
 I'm the king  
Star me ?
Star me 
Star ? once more
Star  once more
??? ?
??? 
???????? ?
???????? 

---category---

Remove ?, , ? , ? and other such signs from Java string
Remove , ,  ,  and other such signs from Java string
? Cats and dogs
 Cats and dogs
I'm on 
I'm on 
Apples ? 
Apples  
? Vi sign
 Vi sign
? I'm the king ? 
 I'm the king  
Star me ?
Star me 
Star ? once more
Star  once more
??? ?
??? 
???????? ?
???????? 

该代码通过将String流式传输到代码点来工作.然后使用lambdas将字符过滤到int数组中,然后我们将数组转换为String.

字母和空格使用使用字符方法来过滤,没有标点符号好.尝试失败.

所述的unicode块白色滤波器使用Unicode块程序员指定为允许.尝试失败.

所述的unicode块黑色滤波器使用Unicode块程序员指定为不允许的.尝试失败.

使用静态方法的类别过滤器Character.getType.程序员可以在category数组中定义允许哪些类型.工作.


请注意,Java语言支持较新的Unicode版本有点慢...例如,Java 10仅支持Unicode 8(因此其字符类仅描述Unicode 8字符)...所以很多表情符号都不是presente(请参阅https:/ /docs.oracle.com/javase/10/docs/api/java/lang/Character.html,*字符信息基于Unicode标准版本8.0.0.*)
推荐阅读
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 本文介绍了如何使用Express App提供静态文件,同时提到了一些不需要使用的文件,如package.json和/.ssh/known_hosts,并解释了为什么app.get('*')无法捕获所有请求以及为什么app.use(express.static(__dirname))可能会提供不需要的文件。 ... [详细]
  • CEPH LIO iSCSI Gateway及其使用参考文档
    本文介绍了CEPH LIO iSCSI Gateway以及使用该网关的参考文档,包括Ceph Block Device、CEPH ISCSI GATEWAY、USING AN ISCSI GATEWAY等。同时提供了多个参考链接,详细介绍了CEPH LIO iSCSI Gateway的配置和使用方法。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • 本文介绍了一种解析GRE报文长度的方法,通过分析GRE报文头中的标志位来计算报文长度。具体实现步骤包括获取GRE报文头指针、提取标志位、计算报文长度等。该方法可以帮助用户准确地获取GRE报文的长度信息。 ... [详细]
  • WebSocket与Socket.io的理解
    WebSocketprotocol是HTML5一种新的协议。它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送 ... [详细]
  • Ihavethefollowingonhtml我在html上有以下内容<html><head><scriptsrc..3003_Tes ... [详细]
  • Java自带的观察者模式及实现方法详解
    本文介绍了Java自带的观察者模式,包括Observer和Observable对象的定义和使用方法。通过添加观察者和设置内部标志位,当被观察者中的事件发生变化时,通知观察者对象并执行相应的操作。实现观察者模式非常简单,只需继承Observable类和实现Observer接口即可。详情请参考Java官方api文档。 ... [详细]
  • 本文介绍了在处理不规则数据时如何使用Python自动提取文本中的时间日期,包括使用dateutil.parser模块统一日期字符串格式和使用datefinder模块提取日期。同时,还介绍了一段使用正则表达式的代码,可以支持中文日期和一些特殊的时间识别,例如'2012年12月12日'、'3小时前'、'在2012/12/13哈哈'等。 ... [详细]
author-avatar
撒谎滴土豆
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有