java字符串拆分正则表达式保留分隔符

时间:2014-09-27 16:18:13

标签: java arrays regex string

提供输入字符串,例如

"abbbcaababbbcaaabbca"

我想将这样的字符串拆分为一组数组" bca" " ab" " a"和" b"

所以上面的例子将返回

"ab", "b", "bca", "ab", "ab", "b", "bca", "a", "ab", "bca".

我有一个29行的嵌套循环代码来完成这个任务(返回ArrayList)。 但是,用一行正则表达式完成这项工作会很好。

可以使用以下方法完成此任务吗?

stringVar.split("regEX") 

3 个答案:

答案 0 :(得分:4)

不是单行,但您可以使用带有循环的Matcher.find来执行此操作。

ArrayList<String> result = new ArrayList<String>();
String s = "abbbcaababbbcaaabbca";
Matcher m = Pattern.compile("bca|ab|a|b").matcher(s);
while (m.find())
    result.add(m.group());

DEMO

答案 1 :(得分:3)

可以使用lookaround assertions来完成,但@ falsetru的答案优于split

String[] ss = "abbbcaababbbcaaabbca".split("(?<=bca|ab)|(?<=a(?=ab))|(?<=b(?=bca))");
System.out.println(Arrays.toString(ss)); //=> [ab, b, bca, ab, ab, b, bca, a, ab, bca]

如果字符串仅包含字母,则可以使用反向引用来缩短它。

String[] ss = "abbbcaababbbcaaabbca".split("(?<=bca|ab)|(?<=(.)(?=\\1))")

答案 2 :(得分:1)

看起来你正试图在相同的角色之间进行分割。在这种情况下,您可以使用

stringVar.split("(?<=(\\w))(?=\\1)") 

但会产生ab, b, bca, abab, b, bca, a, ab, bca,这意味着abab不会被拆分。

如果您需要,可以手动添加案例,您可以在abbca之后决定是否还要通过

分割
stringVar.split("(?<=(\\w))(?=\\1)|(?<=ab|bca)") 

现在将返回ab, b, bca, ab, ab, b, bca, a, ab, bca