2014-09-27 176 views
1

给一个输入字符串如Java字符串分割正则表达式保留定界符

"abbbcaababbbcaaabbca" 

我想这样的字符串分割成组的“bca”阵列“ab”,“a”和“b

所以上面的示例将返回

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

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

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

stringVar.split("regEX") 
+0

什么是分裂的规则/需求这里? – hwnd 2014-09-27 16:20:33

+0

你的要求是什么?你到目前为止做了什么? – 2014-09-27 16:20:40

+0

我不相信拆分会做你想要的。 – Pokechu22 2014-09-27 16:21:48

回答

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

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))") 
+0

用零宽度拆分做这件事是一个挑战。非常好的一个! – 2014-09-27 16:55:22

1

它看起来像你试图分裂相同的字符。在这种情况下,你可以使用

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

,但它会导致ab, b, bca, abab, b, bca, a, ab, bca,这意味着abab不会被拆分。

如果你愿意,你可以手动添加的情况下,你可以决定ab后或bca你也想通过

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

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

+0

+1我喜欢反向引用方式比我的手动方式更好。 – hwnd 2014-09-27 17:05:51

相关问题