Извлечь все совпадения в соседнюю ячейку столбца в Google Таблицах

Вопрос: ищу регулярное выражение Google Таблиц, которое захватывает все экземпляры строки между [t- ] и выводит в соседнюю ячейку столбца в виде массива или какого-либо другого разделителя между совпадениями.

Для следующей строки я пытаюсь извлечь все экземпляры текста между [t- ].

A1:

Lorem Ipsum [t- это просто] фиктивный текст [t- печать] и набор [c- индустрия], поэтому [d- это имело бы смысл], что

Ожидаемый результат - это массив всех вхождений в один столбец:

B1:

[просто печать]

Или вывод может быть любым разделителем совпадений

просто | печать

Попытка выполнить следующее с одним текстом в [t- ] работает нормально, но для нескольких экземпляров извлекается все, что находится между открытым [t- первого появления и ] последнего появления:

=REGEXEXTRACT(A1,"\[t- (.*)\]")

Ведущий к:

просто]! фиктивный текст [t- печать

Я также пробовал несколько групп захвата, но это работает, только если я уверен, что между [t- ] есть только два экземпляра текста - может быть n экземпляров на строку. Также он не выводит результаты в архив в одном столбце, а распределяется по нескольким столбцам:

=regexextract(A1, "(\[t- (.*)\]).*(\[t- (.*)\])" )


РЕДАКТИРОВАТЬ: я получил пару ответов о Regex, который работает с другими инструментами / языками (например, PHP или Javascript), но не с Google Таблицами. Вот синтаксис регулярных выражений Google Таблиц.

РЕДАКТИРОВАТЬ 2. В приведенном выше примере строки есть другой текст в скобках, помеченный другими буквами, например, [c- industry] и [d- it would make]. Их не включать. Только текстовые сообщения в [t- ] (с "t-") должны быть возвращены.


person Growler    schedule 03.02.2019    source источник
comment
Попробуйте \[t-([^]]*)\]. Вы можете проверить и получить объяснение здесь, regex101.com/r/iemQDb/1.   -  person Andrei Odegov    schedule 03.02.2019
comment
@AndreiOdegov это только первое вхождение   -  person Growler    schedule 03.02.2019
comment
как насчет REGEXREPLACE и (?:^|\])[^\[]*(?:\[t-|$) регулярного выражения? проверьте здесь regex101.com/r/WwFjcy/1.   -  person Andrei Odegov    schedule 03.02.2019
comment
@AndreiOdegov, это работает лучше, но при этом также добавляется текст в скобках с другими символами, например, [c- ] или [d- ]. Ему нужно только получать текст в [t- ] и игнорировать замену текста, когда есть другие скобки (например, [c- ] или [d- ])   -  person Growler    schedule 03.02.2019
comment
Позвольте нам продолжить это обсуждение в чате.   -  person Growler    schedule 03.02.2019
comment
Кто является автором синтаксиса Google Sheets Regex? Внизу есть ссылка на пустую страницу.   -  person Rubén    schedule 03.02.2019
comment
@Growler, все тот же REGEXREPLACE, но с новым регулярным выражением ^.*?\[t-|(?<=\[t-).*?\K\].*?(?:\[t-|$). Проверьте это здесь, regex101.com/r/WwFjcy/2.   -  person Andrei Odegov    schedule 04.02.2019
comment
@AndreiOdegov спасибо, но вы не тестируете в таблицах Google? Синтаксис неверный.   -  person Growler    schedule 04.02.2019
comment
@ Оньямбу, что ты имеешь в виду? Это не похоже на действительный синтаксис для Google Таблиц. Как это будет выглядеть во всей формуле?   -  person Growler    schedule 04.02.2019


Ответы (2)


Подобно методике, использованной здесь,

  • REGEXREPLACE все с [t-.*] по (.*)
  • Предоставьте полученное выражение сверху как регулярное выражение для REGEXEXTRACT
  • \Q..\E используется для экранирования других символов

    =REGEXEXTRACT(A1, "\Q"&REGEXREPLACE(A1,"\[t-[^]]+\]","\\E(.*)\\Q")&"\E")
    

В качестве альтернативы, если ограничить только REGEXREPLACE,

=REGEXREPLACE(A1,"(^|\])(.*?)(\[t-|$)","$1|$3")
=SPLIT(REGEXREPLACE(A1,"(^|\])(.*?)(\[t-|$)","$1|$3"),"|")

Заменить все символы .*, которые

  • Начать с ] или начала строки ^
  • Заканчивается на [t- или на конец строки $

с ]|[t-

person TheMaster    schedule 03.02.2019
comment
Это здорово - они работают во всех случаях, кроме случаев, когда два [t- ] находятся рядом друг с другом с пробелом и без пробела. Например, когда строка [t- hello] [t- world]. В результате вы получите [t- hello] [t- в одной ячейке столбца как совпадение и world] в следующей. Когда строка равна [t- hello][t- world] (без пробела), вы получаете [t- hello][t- world] как единственное совпадение в ячейке - person Growler; 04.02.2019
comment
@Growler Второе регулярное выражение отлично работает в обоих случаях, и вывод точно такой же, как и первое с split. Первый не сработал из-за жадности (.*). Если мы изменим его на "\\E(\\Q$0\\E)\\Q", все заработает. - person TheMaster; 04.02.2019
comment
Спасибо! Это прекрасно работает. Очень жаль, что regexextract не имеет жадной опции для извлечения всех экземпляров - person Growler; 04.02.2019
comment
@Growler, по сравнению с excel наличие регулярного выражения в таблице само по себе является благом. - person TheMaster; 04.02.2019

пуленепробиваемое решение:

="["&JOIN(", ", ARRAYFORMULA(REGEXREPLACE(
 QUERY(SPLIT(TRANSPOSE(SPLIT(A1, "[")), "]"), 
 "select Col1 where Col1 contains 't- '", 0), 
 "t- ", "")))&"]"

__________________________________________________________

=JOIN(" | ", ARRAYFORMULA(REGEXREPLACE(
 QUERY(SPLIT(TRANSPOSE(SPLIT(A1, "[")), "]"), 
 "select Col1 where Col1 contains 't- '", 0), 
 "t- ", "")))

person player0    schedule 04.02.2019