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

4
我需要将一个可能包含表情符号的字符串拆分为单个字符的列表(保留表情符号)。目前,任何表情符号都会被拆分成它的各个部分,这是可以预见的情况。
String s = "abc";
String[] tokens = s.split("");
// tokens is ["?","?","?","?","a","b","c","?","?"]
// tokens should be ["","","a","b","c",""]

我希望尽可能减少项目的大小并尽量少依赖,因此我想远离任何第三方库。确切的输出类型并不太重要,只要我能按顺序遍历标记就可以了。


如果您正在使用Java 9+,请尝试使用List<String> results = Pattern.compile("\\P{M}\\p{M}*+").matcher(s).results().map(MatchResult::group).collect(Collectors.toList());。请参见demo - Wiktor Stribiżew
s.replaceAll("\\p{So}|.", "$0\0").split("\0+"); 这段代码也适用于你。 - anubhava
2个回答

5
您可以匹配并提取由基础字符和任意数量的附加符号组成的所有Unicode代码点:
\P{M}\p{M}*+

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

Java 9+ 演示:

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, ]

查看另一个Java演示


3
无法处理超过一个 Unicode 代码点的表情符号。例如:https://emojipedia.org/man-rowing-boat/ - alexdriedger

0

这个方法也可能适用于你,通过匹配 \p{So}(其他符号)

String s = "abc";
String[] arr = s.replaceAll("\\p{So}|.", "$0\0").split("\0+");
//=> { "", "", "a", "b", "c", "" }

假设您的输入不包含 NUL 字节或 \0 否则您可以使用传统的匹配和收集方法:

List<String> arr = new ArrayList<>();
Matcher m = Pattern.compile("\\P{So}|.").matcher(s);

while (m.find()) {
   arr.add(m.group());
}
System.out.println(arr);
//=> [, , a, b, c, ]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接