从模式中提取单词

时间:2015-08-05 00:44:46

标签: java regex

我有String s = "#stack###over##flow".如何将s拆分为

String[] a = {"#", "stack", "###", "over", "##", "flow}

我在How to split a string, but also keep the delimiters?中尝试了s.split("(?<=#)|(?=#)"),但它提供了

String[] a = {"#", "stack", "#", "#", "#", "over", "#", "#", "flow}

2 个答案:

答案 0 :(得分:5)

外观需要更加自信,这意味着后面需要断言以下位置是单词字符或不是#,并且前瞻需要断言前面的位置是也可以是单词字符,也可以是#

您可以在每次轮换中使用word boundaries

String s = "#stack###over##flow";
String[] a = s.split("(?<=#\\b)|(?=\\b#)");
System.out.println(Arrays.toString(a)); //=> [#, stack, ###, over, ##, flow]

或修改您的外观断言(更长的方法):

String[] a = s.split("(?<=#(?!#))|(?<=[^#](?=#))");

答案 1 :(得分:2)

我认为有更好的方式..

看起来很疯狂:

\b

Regex live here.