java - 拆分包含表情符号的字符串

标签 java regex string emoji

我需要将可能包含或不包含表情符号的字符串拆分为单个字符列表(保持表情符号完整)。目前,正如预期的那样,任何表情符号都被分成各个部分。

String s = "🙁🙂abc🙁";
String[] tokens = s.split("");
// tokens is ["?","?","?","?","a","b","c","?","?"]
// tokens should be ["🙁","🙂","a","b","c","🙁"]

我想将项目大小保持在最低限度并且几乎没有依赖项,因此我想远离任何第 3 方库。确切的输出类型并不重要,只要我至少可以按顺序遍历标记即可。

最佳答案

您可以匹配并提取所有由基本字符和该字符后任意数量的变音符号组成的 Unicode 代码点:

\P{M}\p{M}*+

它匹配除变音符号以外的任何字符,然后匹配任何 0+ 变音符号字符。

Java 9+ demo :

import java.util.*;
import java.util.stream.*;
import java.util.regex.*;

class Ideone
{
    public static void main (String[] args) throws java.lang.Exception
    {
        String s = "🙁🙂abc🙁";
        List<String> results = Pattern.compile("\\P{M}\\p{M}*+").matcher(s)
            .results()
            .map(MatchResult::group)
            .collect(Collectors.toList());
        System.out.println(results); 
    }
}
// => [🙁, 🙂, a, b, c, 🙁]

在早期的 Java 版本中,您可以使用

import java.util.regex.*;
//.....
String s = "🙁🙂abc🙁";
List<String> results = new ArrayList<>();
Matcher m = Pattern.compile("\\P{M}\\p{M}*+").matcher(s);
while (m.find()) {
    results.add(m.group());
}
System.out.println(results);  // => [🙁, 🙂, a, b, c, 🙁]

参见 another Java demo

关于java - 拆分包含表情符号的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59311482/

相关文章:

java - 资源 android :style/TextAppearance. 未找到 Material

java - 从原生 Android 代码访问 html5 存储

Java正则表达式模式匹配

python - 如何剥离 [] 中的所有内容

查找与负正则表达式匹配的字符串中最后位置的 Pythonic 方法

c# - 在 C# 的字符串中将 "\\"替换为 "\"

java - 如何使用 systemd-run 运行子进程并等待其完成

java - 我们可以用JPQL编写描述表查询吗?

javascript - 正则表达式中的多个匹配并存储或打印它

java - Java中如何从特定索引中获取关键字