我正在尝试重新创建不和谐的表情符号解析消息的方式。
例如,我希望消息Hello, :smile::hearth: world!拆分为以下数组:
["Hello, ", ":smile:", ":hearth:", " world!"]
Run Code Online (Sandbox Code Playgroud)
我已经尝试使用以下代码拆分数组:
Arrays.toString(message.split("(:[A-Za-z]+:)"))
Run Code Online (Sandbox Code Playgroud)
但是,split方法会删除找到的定界符。因此最终结果如下所示:
["Hello", , , " world!"]
Run Code Online (Sandbox Code Playgroud)
根据您输入的字符串和预期结果,我可以推断出您基本上想从三个规则中拆分字符串。
因此,您可以对上述所有三种情况使用交替使用此正则表达式。
(?<=:)(?=:)|(?<= )(?=:)|(?<=:)(?= )
Run Code Online (Sandbox Code Playgroud)
Java代码
String s = "Hello, :smile::hearth: world!";
System.out.println(Arrays.toString(s.split("(?<=:)(?=:)|(?<= )(?=:)|(?<=:)(?= )")));
Run Code Online (Sandbox Code Playgroud)
像您的预期输出一样打印,
[Hello, , :smile:, :hearth:, world!]
Run Code Online (Sandbox Code Playgroud)
另外,作为替代方案,如果您可以使用匹配文本而不是分割文本,则正则表达式将更易于使用,就是这样,
:[^:]+:|\S+
Run Code Online (Sandbox Code Playgroud)
Java代码
String s = "Hello, :smile::hearth: world!";
Pattern p = Pattern.compile(":[^:]+:|\\S+");
Matcher m = p.matcher(s);
while(m.find()) {
System.out.println(m.group());
}
Run Code Online (Sandbox Code Playgroud)
印刷品
Hello,
:smile:
:hearth:
world!
Run Code Online (Sandbox Code Playgroud)