2014-09-27 233 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

相關問題