Разбить массив строк в Java с помощью регулярных выражений - PullRequest
0 голосов
/ 01 ноября 2018

Я пытаюсь разбить эту строку:

ABA (2) бб (52) дс (4) d (2) Fe (14) F (6) г (8) ч (4) 5 (6)

так выглядит этот массив:

[a, b, a (2), b, b (52), g, c (4), d (2), f, e (14), f (6), g (8)]

Вот правила: он может принимать буквы a - g , это может быть одна буква, но если после нее есть скобки, он должен включать их и их содержимое. Содержимое скобок должно быть числовым значением .

Вот что я пытался:

content = "aba(2)bb(52)gc(4)d(2)fe(14)f(6)g(8)h(4)5(6)";
        a = content.split("[a-g]|[a-g]\\([0-9]*\\)");
        for (String s:
             a) {
            System.out.println(s);
        }

А вот и вывод

(2)

(52) * +1027 *

(4) (2)

(14) (6) (8) ч (4) 5 (6)

Спасибо.

Ответы [ 4 ]

0 голосов
/ 01 ноября 2018

Если вы хотите использовать только метод разделения, вот подход, который вы тоже можете использовать,

import java.util.Arrays;

public class Test 
{
   public static void main(String[] args)
   {
        String content = "aba(2)bb(52)gc(4)d(2)fe(14)f(6)g(8)h(4)5(6)";
        String[] a = content.replaceAll("[a-g](\\([0-9]*\\))?|[a-g]", "$0:").split(":");
        // $0 is the string which matched the regex

        System.out.println(Arrays.toString(a));

   }

}

Regex: [a-g](\\([0-9]*\\))?|[a-g] соответствует строкам, с которыми вы хотите соответствовать (то есть a, b, a (5) и т. Д.)

Используя это регулярное выражение, я сначала заменяю эти строки их добавленными версиями (с добавлением :). Позже я разбил строку, используя метод split.

Вывод вышеуказанного кода:

[a, b, a(2), b, b(52), g, c(4), d(2), f, e(14), f(6), g(8), h(4)5(6)]

ПРИМЕЧАНИЕ. Этот подход будет работать только с разделителем, который, как известно, отсутствует во входной строке. Например, я выбрал двоеточие, потому что предполагал, что оно не будет частью входной строки.

0 голосов
/ 01 ноября 2018

Разделение - неправильный подход для этого, поскольку трудно устранить неправильные записи.

Просто "сопоставить", что бы ни было допустимым, и обработать массив результатов найденных совпадений:

[a-g](?:\(\d+\))?

Regular expression visualization

Демо Debuggex

0 голосов
/ 01 ноября 2018

Вы можете попробовать следующее регулярное выражение: [a-g](\(.*?\))?

  • [a-g]: требуются буквы от a до g
  • (\(.*?\))?: любое количество символов от ( до ), соответствующее как можно меньшему числу раз

Вы можете просмотреть ожидаемый результат здесь .

Этот ответ основан на Pattern, пример:

String input = "aba(2)bb(52)gc(4)d(2)fe(14)f(6)g(8)h(4)5(6)";

Pattern pattern = Pattern.compile("[a-g](?:\\(\\d+\\))?");
Matcher matcher = pattern.matcher(input);
List<String> tokens = new ArrayList<>();
while (matcher.find()) {
    tokens.add(matcher.group());
}

tokens.forEach(System.out::println);

Результирующий вывод:

a
b
a(2)
b
b(52)
g
c(4)
d(2)
f
e(14)
f(6)
g(8)

Редактировать: Используя [a-g](?:\((.*?)\))?, вы также можете легко извлечь внутреннее значение скобки:

while (matcher.find()) {
    tokens.add(matcher.group());
    tokens.add(matcher.group(1)); // the inner value or null if no () are present 
}
0 голосов
/ 01 ноября 2018

Проще сопоставить эти подстроки:

String content = "aba(2)bb(52)gc(4)d(2)fe(14)f(6)g(8)h(4)5(6)";
Pattern pattern = Pattern.compile("[a-g](?:\\(\\d+\\))?");
List<String> res = new ArrayList<>();
Matcher matcher = pattern.matcher(content);
while (matcher.find()){
    res.add(matcher.group(0)); 
} 
System.out.println(res);

Выход:

[a, b, a(2), b, b(52), g, c(4), d(2), f, e(14), f(6), g(8)]

См. Демонстрационную версию Java и демонстрационную версию regex .

Детали шаблона

  • [a-g] - письмо от a до g
  • (?:\(\d+\))? - необязательная группа без захвата, соответствующая 1 или 0 вхождениям
    • \( - ( char
    • \d+ - 1+ цифр
    • \) - ) char.
...