提供输入字符串,例如
"abbbcaababbbcaaabbca"
我想将这样的字符串拆分为一组数组" bca
" " ab
" " a
"和" b
"
所以上面的例子将返回
"ab", "b", "bca", "ab", "ab", "b", "bca", "a", "ab", "bca".
我有一个29行的嵌套循环代码来完成这个任务(返回ArrayList)。 但是,用一行正则表达式完成这项工作会很好。
可以使用以下方法完成此任务吗?
stringVar.split("regEX")
答案 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());
答案 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
不会被拆分。
如果您需要,可以手动添加案例,您可以在ab
或bca
之后决定是否还要通过
stringVar.split("(?<=(\\w))(?=\\1)|(?<=ab|bca)")
现在将返回ab, b, bca, ab, ab, b, bca, a, ab, bca