Java replaceAll для разделенной запятой String с регулярным выражением - PullRequest
0 голосов
/ 10 мая 2018

У меня есть эта строка:

String a = [MercadosArmados.GpoMerc-CTN3].[Mercado Marketing SNC].[Mk Alprazolam], [MercadosArmados.GpoMerc-CTN3].[Mercado Marketing SNC].[Mk Amantadina]

Мне нужно извлечь только 3-е [значение] каждого блока, разделенного запятыми. Например, мне нужно напечатать: МК Алпразолам, МК Амантадина

Я помещу это в выражение текстового поля JasperReport, поэтому мне нужно сделать это одной строкой. Пример:

a.substring(0, a.indexOf(",")).substring(a.substring(0, a.indexOf(",")).lastIndexOf("[")).replace("[", "").replaceAll("]", "")

это возвращает: Mk Alprazolam ... но мне это нужно для каждого блока, разделенного запятыми (это может быть 1 +).

Я пробовал некоторые регулярные выражения с .replaceAll, но не могу этого достичь.

Любая помощь будет оценена.

Спасибо

Ответы [ 4 ]

0 голосов
/ 10 мая 2018

Вы можете использовать следующее регулярное выражение и взять из него 3-е (или те, где по модулю 3 равно 0) совпадение

(?:((?<=\[)(.*?)(?=\])))+

Этоregex использовал lookaheads и lookbehind, чтобы увидеть, есть ли скобка до или после целевой строки.

0 голосов
/ 10 мая 2018

Чистый replaceAll() раствор:

s = s.replaceAll("\\[[^\\]]*\\]\\.|[\\[\\]]", "");

См. regex101 для демонстрации.

Объяснение

Исходный текст:

[MercadosArmados.GpoMerc-CTN3].[Mercado Marketing SNC].[Mk Alprazolam], [MercadosArmados.GpoMerc-CTN3].[Mercado Marketing SNC].[Mk Amantadina]

Сначала он соответствует [xxx]. и заменяет их ничем. Это оставляет:

[Mk Alprazolam], [Mk Amantadina]

Затем он также соответствует [ и ] и заменяет их ничем. Результат:

Mk Alprazolam, Mk Amantadina

0 голосов
/ 10 мая 2018

Вот как извлечь нужную информацию с помощью регулярного выражения:

String a = "[MercadosArmados.GpoMerc-CTN3].[Mercado Marketing SNC].[Mk Alprazolam], [MercadosArmados.GpoMerc-CTN3].[Mercado Marketing SNC].[Mk Amantadina]";
Pattern p = Pattern.compile("(?:\\[[^\\[]*\\]\\.){2}\\[([^\\[]*)\\]");
Matcher m = p.matcher(a);
while (m.find()) {
    System.out.println(m.group(1));
}

Напечатает:

Mk Alprazolam
Mk Amantadina

Вы также можете проверить регулярное выражение онлайн .

0 голосов
/ 10 мая 2018

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

Arrays.stream(a.split(","))
            .map(str -> str.substring(str.lastIndexOf(".") + 2, str.length() - 1))
            .forEach(System.out::println);
  1. Мы разбиваем входную строку на ,.

  2. Для каждой части (сверху) извлекаем подстроку, начиная с последнего индекса '.' + 2 и заканчивая индексом один до конца строки

  3. Распечатайте каждый из них.

Вы можете присоединиться к отдельным строкам как

String result = Arrays.stream(a.split(","))
            .map(str -> str.substring(str.lastIndexOf(".") + 2, str.length() - 1))
            .collect(Collectors.joining(" , "));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...