Вот один из подходов. На самом деле не «разбить это» за один раз, но это, вероятно, то, что я бы сделал.
String[] tests = {"(ab)(bc)(ca)", "abc", "(abc)b c", "a (bb) c" };
Pattern p = Pattern.compile("\\s*(\\(.*?\\)|.)\\s*");
for (String test : tests) {
Matcher m = p.matcher(test);
System.out.println("Test: " + test);
while (m.find())
System.out.println(" Part: " + m.group().replaceAll("[() ]", ""));
System.out.println();
}
Выход:
Test: (ab)(bc)(ca)
Part: ab
Part: bc
Part: ca
Test: abc
Part: a
Part: b
Part: c
Test: (abc)b c
Part: abc
Part: b
Part: c
Test: a (bb) c
Part: a
Part: bb
Part: c
Нечто подобное может даже подойти (возможно, я использовал свойство вашего примера, которого нет в вашей «реальной» проблеме. Я ненавижу, когда люди делают это с моими вопросами, поэтому я заранее извиняюсь, если это так !):
String[] tests = {"(ab)(bc)(ca)", "abc", "(abc)b c", "a (bb) c" };
for (String test : tests) {
String[] parts = test.length() == 3
? test.split("(?<=.)")
: test.replaceAll("[()]", " ").trim().split("\\s+");
System.out.printf("Test: %-16s Parts: %s%n", test, Arrays.toString(parts));
}
Выход:
Test: (ab)(bc)(ca) Parts: [ab, bc, ca]
Test: abc Parts: [a, b, c]
Test: (abc)b c Parts: [abc, b, c]
Test: a (bb) c Parts: [a, bb, c]