Java: извлечь отдельные совпадающие группы из строки с помощью регулярного выражения [duplicate]

1

У меня есть такая строка: 16B66C116B или 222A3 * C10B Это число (с нечетными цифрами) или буква ("A") или звезда и буква ("* A"). Этот повтор повторяется 3 раза.

Я хочу разбить эту строку, чтобы иметь: [число, текст, число, текст, номер, текст]

[16, B, 66, C, 116, B] 

или

[16, B, 66, *C, 116, B]

Я написал это:

    String tmp = "16B66C116B";
    String tmp2 = "16B66*C116B";
    String pattern = "(\\d+)(\\D{1,2})(\\d+)(\\D{1,2})(\\d+)(\\D{1,2})";
    boolean q = tmp.matches(pattern);
    String a[] = tmp.split(pattern);

шаблон соответствует правилу, но расщепление не работает.

(Я открыт для улучшения строки шаблона, я думаю, что это может быть лучше написано).

  • 2
    Каков ожидаемый результат?
  • 0
    Дайте пример ввода и вывода ..
Показать ещё 1 комментарий
Теги:
string
string-matching

2 ответа

2
Лучший ответ

Вы не понимаете функциональность split. Split разделит строку на появление данного регулярного выражения, так как ваше выражение соответствует всей строке, оно возвращает пустой массив.

Вы хотите извлечь отдельные matching groups (материал в скобках) из совпадения. Для этого вы должны использовать классы Pattern и Matcher.

Здесь фрагмент кода, который распечатает все совпадения:

Pattern regex = Pattern.compile("(\\d+)(\\D{1,2})(\\d+)(\\D{1,2})(\\d+)(\\D{1,2})");
Matcher matcher = regex.matcher("16B66C116B");

while (matcher.find()) {
    for (int i = 1; i <= matcher.groupCount(); ++i) {
        System.out.println(matcher.group(i));
    }
}

Конечно, вы можете улучшить регулярное выражение (как и любой другой пользователь)

(\\d+)([A-Z]+)(\\d+)(\\*?[A-Z]+)(\\d+)([A-Z]+)
  • 0
    Звезда может появляться перед каждой буквой, и есть только одна буква, поэтому я думаю, что шаблон такой: (\\ d +) (\ *? [AZ]) Спасибо, ребята! Я обнаружил, что то же самое можно написать: (\\ d +) (\ *? [AZ]) (\\ d +) (\ *? [AZ]) (\\ d +) (\ *? [AZ])
2

Попробуйте использовать этот шаблон (\\d)+|(\\D)+ и используйте Matcher # find(), чтобы найти следующую подпоследовательность входной последовательности, которая соответствует шаблону.

Добавьте все из них в список или, наконец, преобразуйте его в массив.

    String tmp = "16B66C116B";
    String tmp2 = "16B66*C116B";
    String pattern = "((\\d)+|(\\D)+)";

    Pattern p = Pattern.compile(pattern);
    Matcher m = p.matcher(tmp);
    while (m.find()) {
        System.out.println(m.group());
    }

Ещё вопросы

Сообщество Overcoder
Наверх
Меню