Гугл таблицы. Как с помощью регулярного выражения вырезать несколько однотипных выражений из одной строки?
Есть закодированные строки вида:
2201.1204# Dell; @ Маша; @ Петя; Разгрузка вагонов.
2201.1203# Dell; @ Иван; Доставка заказчику.
Мне нужно вытащить имена. Одно, первое просто =REGEXEXTRACT(A1;"@\s(.+);") - Маша
А как получит все?
Два значения Маша и Петя в первом случае, и Иван во втором.
Ответы (2 шт):
И Вуаля: =IFNA(TEXTJOIN(" ";TRUE;ArrayFormula(trim(REGEXREPLACE(SPLIT(REGEXEXTRACT(D85;"(?:@\s)(?:.+);");";"); "@ "; "")))); "?!")
Конструкция громоздкая, зато работает. Вытаскиваю все имена независимо от их количества и собираю через перевод каретки в одну ячейку. Получаю:
Маша
Петя
Если искомых значений нет сигнализирую:
?!
В общем случае гораздо удобнее работать с функцией:
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- оставлять пустые значения.
Пример работы скрипта:
