расщепление строки основывается на шаблоне - PullRequest
1 голос
/ 06 мая 2011

У меня есть строка с шаблоном (ab)(bc)(ca) или abc.Теперь, если присутствует (), тогда мне нужно выполнить вставку следующим образом:

pattern (ab)(bc)(ca)  OP A=ab B= bc C= ca
pattern abc           OP A=a  B=b   C=c
parrtern (abc)b c     OP A=abc B=b  c= c
parrtern a (bb) c     OP A=abc B=bb  c= c

Как я могу использовать регулярные выражения для разбиения строки следующим образом?

Ответы [ 3 ]

3 голосов
/ 06 мая 2011

Вот один из подходов. На самом деле не «разбить это» за один раз, но это, вероятно, то, что я бы сделал.

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]
2 голосов
/ 06 мая 2011

Вы можете использовать Гуава * Splitter класс. Это может разделить на много разных вещей.

(или я так думал, пока вопрос не был обновлен с дополнительной информацией)


Arg, теперь вы добавили информацию, и я не думаю, что какой-либо метод Split приведет вас туда. Это будет, однако:

String s = " (abc)b c";
Matcher matcher = Pattern.compile("(?<=\\()[a-z]{2,}(?=\\))|[a-z]").matcher(s);
while (matcher.find()){
    System.out.println(matcher.group());
}

Теперь, если вам нужны элементы в массиве или коллекции, просто замените вызов System.out.println() на что-то более разумное.

Выход:

abc
b
c

Шаблон объяснил:

(?<=\\()  // match after an opening parenthesis
[a-z]{2,} // match two or more letters
(?=\\))   // match before closing parenthesis
|         // or
[a-z]     // match a single letter
2 голосов
/ 06 мая 2011

Выезд String.split(..);.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...