如何在Java中拆分字符串但保留定界符?

时间:2019-05-15 19:26:04

标签: java regex

我正在尝试重新创建不和谐的表情符号解析消息的方式。

例如,我希望将消息["Hello, ", ":smile:", ":hearth:", " world!"] 拆分为以下数组:

Arrays.toString(message.split("(:[A-Za-z]+:)"))

我已经尝试使用以下代码拆分数组:

["Hello", , , " world!"]

但是,split方法会删除找到的定界符。所以最终结果看起来像这样:

by_selection_id = operator.itemgetter('selection_id')
market.sort(key=by_selection_id)

2 个答案:

答案 0 :(得分:7)

从您的输入字符串和预期结果来看,我可以推断出您基本上想从三个规则中分割字符串。

  • 从冒号的前面和后面分开
  • 从前面加一个空格和一个冒号的点开始分割
  • 从一个冒号和一个空格后面的点开始分裂

因此,您可以对上述所有三种情况使用交替形式使用此正则表达式。

(?<=:)(?=:)|(?<= )(?=:)|(?<=:)(?= )

Regex Demo

Java代码

String s = "Hello, :smile::hearth: world!";
System.out.println(Arrays.toString(s.split("(?<=:)(?=:)|(?<= )(?=:)|(?<=:)(?= )")));

打印出预期的效果,

[Hello, , :smile:, :hearth:,  world!]

另外,如果您可以使用匹配文本而不是拆分的方法,则正则表达式将更易于使用,而正是这样,

:[^:]+:|\S+

Regex Demo using match

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());
}

打印

Hello,
:smile:
:hearth:
world!

答案 1 :(得分:1)

请使用正则表达式的Lookahead,向后看以获得预期的结果。请参考下面的代码片段

 public static void main(String[] args) {
       String message= "Hello, :smile::hearth: world!"; 
       System.out.println(Arrays.toString(message.split("(?=,)|(?=(?!)::)|(?<=(:[A-Za-z]+:))")));


    }

哪个将输出为 [你好,:: mile :,:hearth :,世界!]