java - 拆分包含表情符号的字符串
问题描述
我需要将可能包含或不包含表情符号的字符串拆分为单个字符列表(保持表情符号完整)。目前,正如预期的那样,任何表情符号都被分割成各个部分。
String s = "abc";
String[] tokens = s.split("");
// tokens is ["?","?","?","?","a","b","c","?","?"]
// tokens should be ["","","a","b","c",""]
我想将项目规模保持在最低限度,并且几乎没有依赖项,所以我想远离任何 3rd 方库。确切的输出类型并不重要,只要我至少可以按顺序遍历标记。
解决方案
您可以匹配并提取由基本字符和该字符之后的任意数量的变音符号组成的所有 Unicode 代码点:
\P{M}\p{M}*+
它匹配除变音符号以外的任何字符,然后匹配任何 0+ 变音符号字符。
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, ]
推荐阅读
- docker - Dockerfiles 和复制/添加
- java - 在 Eclipse IDE 中运行 yourkit 的问题
- go - Go Transport 中的 keep-alive TTL 从不关闭连接
- phpstorm - PhpStorm“rsa 密钥已损坏或版本错误”
- auth0 - Auth0 和 HostedPages
- javascript - 读取 JSON 并在 HTML 中实现
- rest - 使用 OAuth 注册一个 REST API
- sql - SQL Server 可以自动将随机 int 分配给 IDENTITY 列吗?
- c - atoi 似乎不适用于我的程序
- laravel - Laravel 创建 .po 和 .mo