【问题标题】:Splitting a String that contains emojis拆分包含表情符号的字符串
【发布时间】:2020-04-06 06:02:46
【问题描述】:

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

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

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

【问题讨论】:

  • 如果您使用的是 Java 9+,请尝试 List<String> results = Pattern.compile("\\P{M}\\p{M}*+").matcher(s).results().map(MatchResult::group).collect(Collectors.toList());。见demo
  • s.replaceAll("\\p{So}|.", "$0\0").split("\0+"); 应该也适合你。

标签: java regex string emoji


【解决方案1】:

您可以匹配并提取所有由基本字符和该字符后任意数量的变音符号组成的 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

【讨论】:

【解决方案2】:

匹配\p{So} (Other Symbol)也可能对您有用:

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

【讨论】:

    猜你喜欢
    • 2021-10-25
    • 2014-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-12
    • 2010-12-25
    • 1970-01-01
    相关资源
    最近更新 更多