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

Есть закодированные строки вида:

2201.1204# Dell; @ Маша; @ Петя; Разгрузка вагонов.

2201.1203# Dell; @ Иван; Доставка заказчику.

Мне нужно вытащить имена. Одно, первое просто =REGEXEXTRACT(A1;"@\s(.+);") - Маша

А как получит все?

Два значения Маша и Петя в первом случае, и Иван во втором.


Ответы (2 шт):

Автор решения: Yaros75

И Вуаля: =IFNA(TEXTJOIN(" ";TRUE;ArrayFormula(trim(REGEXREPLACE(SPLIT(REGEXEXTRACT(D85;"(?:@\s)(?:.+);");";"); "@ "; "")))); "?!")

Конструкция громоздкая, зато работает. Вытаскиваю все имена независимо от их количества и собираю через перевод каретки в одну ячейку. Получаю:


Маша

Петя


Если искомых значений нет сигнализирую:


?!


→ Ссылка
Автор решения: Wiktor Stribiżew

В общем случае гораздо удобнее работать с функцией:

function ExtractAllRegex(input, pattern, groupId, separator="", keepEmpty=false) {
  let matches = Array.from(input.matchAll(new RegExp(pattern, 'g')), x => x[groupId]);
  if (!keepEmpty) {
    matches = matches.filter(Boolean);
  }
  if (separator) {
    return [matches.join(separator)];
  }
  return [matches];
}

Затем в ячейке достаточно указать =ExtractAllRegex(D85; "@\s*(\S+);"; 1) . или =ExtractAllRegex(D85; "@\s*(\S+);"; 1, "", 0).

Подробности:

  • input - адрес текущей ячейки
  • pattern - регулярное выражение
  • groupId - номер захватывающей подмаски (0 - целое совпадение, 1 - значение первой подмаски и т.д.)
  • separator - текст-разделитель для найденных значений
  • keepEmpty - оставлять пустые значения.

Пример работы скрипта:

введите сюда описание изображения

→ Ссылка