Несколько регулярных выражений в Формуле Google Таблиц

Я пытаюсь получить список всех цифр, предшествующих дефис в данной строке (скажем, в ячейке A1), используя формулу регулярного выражения Google Таблиц:

=REGEXEXTRACT(A1, "d-")

моя проблема заключается в том, что он возвращает только первый матч... как я могу получить все матчи?

пример текста:

"A1-Nutrition;A2-ActPhysiq;A2-BioMeta;A2-Patho-jour;A2-StgMrktg2;H2-Bioth2/EtudeCas;H2-Bioth2/Gemmo;H2-Bioth2/Oligo;H2-Bioth2/Opo;H2-Bioth2/Organo;H3-Endocrino;H3-Génétiq"

моя формула возвращает 1-, тогда как я хочу получить 1-2-2-2-2-2-2-2-2-2-3-3- (либо как массив или объединяются текст).

Я знаю, что мог бы использовать скрипт или другая функция (например,SPLIT) для достижения желаемого результата, но я действительно хочу знать, как я мог бы получить регулярное выражение re2 для возврата таких нескольких совпадений в"REGEX.* " Google Таблицы формула. Что-то вроде "global-не возвращайтесь после первого матча " option on regex101.com

Я также попытался удалить нежелательный текст с помощью REGEXREPLACE, без успеха (я не мог избавиться от других цифр не перед дефисом).

любая помощь приветствуется! Спасибо :)

3 ответов


редактировать

Я придумал более общее решение:

=regexreplace(A1,"(.)?(\d-)|(.)","")


попробуйте эту формулу:

=regexreplace(regexreplace(A1,"[^\-0-9]",""),"(\d-)|(.)","")

он будет обрабатывать строку, как это:

"A1-Nutrition;A2-ActPhysiq;A2-BioM---eta;A2-PH3-Généti***566*9q"

С выход:

1-2-2-2-3-


вы можете сделать это в одной формуле, используя regexreplace, чтобы окружить все значения группой захвата вместо замены текста:

=join("",REGEXEXTRACT(A1,REGEXREPLACE(A1,"(\d-)","()")))

это окружить все экземпляры \d- с "группой захвата", а затем с помощью извлечения regex, он аккуратно возвращает все захваты. если вы хотите объединить его обратно в одну строку, вы можете просто использовать join, чтобы упаковать его обратно в одну ячейку:

enter image description here


это, кажется, работает, и я попытался проверить это.

логика

(1) заменить букву, за которой следует дефис на nothing

(2) Замените любую цифру, за которой не следует дефис, ничем

(3) Замените все, что не является цифрой или дефисом, ничем

=regexreplace(A1,"[a-zA-Z]-|[0-9][^-]|[a-zA-Z;/é]","")

результат

1-2-2-2-2-2-2-2-2-2-3-3-

анализ

мне пришлось пройти через это процедурно, чтобы убедить себя, что это было правильный. Согласно этой ссылке когда есть альтернативы, разделенные символом трубы, регулярное выражение должно соответствовать им в порядке слева направо. Приведенная выше формула не работает должным образом, если Правило 1 не приходит первым (в противном случае он уменьшает все символы, кроме цифры или дефиса до нуля, прежде чем правило (1) может вступить в игру, и вы получите дополнительный дефис от "Patho-jour").

вот несколько примеров того, как я думаю, что он должен иметь дело с текст

enter image description here