Почему regexreplace и regexextract в Google Sheets работают по-разному? - PullRequest
0 голосов
/ 09 мая 2020

В этой строке

ID = "APPLE"; ТЕКСТ = "ЯБЛОКО"; FOO = "BAR";

Я буду использовать это регулярное выражение

TEXT = "(. *?)"

Чтобы изменить TEXT = APPLE "APPLE" в BANANA.

Использование regexextract return

APPLE

, но затем regexreplace возвращает

ID = "ЯБЛОКО"; БАНАН; FOO = "BAR";

, что, я думаю, должно быть TEXT = "BANANA", учитывая, что APPLE - это то, что возвращает регулярное выражение.

Что мне делать, чтобы это было так?

ID = "ЯБЛОКО"; ТЕКСТ = "БАНАН"; FOO = "BAR";

Пример ссылки

Ответы [ 2 ]

1 голос
/ 11 мая 2020

Думаю, вам не повезло с этим вопросом.

Прежде всего, REGEXREPLACE заявил в документации, что фактически изменит весь совпадающий текст:

regular_expression - Регулярное выражение. Все совпадающие экземпляры в тексте будут заменены.

Таким образом, даже при использовании групп захвата вы получите всю совпадающую строку. Я не знаю, может ли это быть проблемой или предполагаемым поведением, вы все равно можете сообщить, если хотите ( Справка> Отправить отзыв в Google ).

Другой способ мышления - использование просмотра вперед и назад, чтобы избежать совпадения нежелательного текста.

(?<=TEXT=")(.*?)(?=";)

Проблема с этим подходом заключается в том, что функции листов Google используют реализацию RE2 для регулярного выражения. Это означает, что смотреть вперед и смотреть назад не реализованы .


Обходной путь

Мое предложение для решения всех проблем заключалось бы в создании простой пользовательской функции скрипта приложений. поэтому вы можете использовать регулярное выражение javascript.

Я сделал очень простой код для вашего случая

function sensibleRegExpReplace(input, regEx, replace){

  var reg = new RegExp(regEx);

  return input.replace(reg, replace);

}

И вы получите следующий результат:

Example of result

Я полагаю, что есть способ сделать все это, используя только встроенные функции листов с использованием вспомогательных ячеек. Но мне не удалось заставить его работать, и это кажется более элегантным.

0 голосов
/ 18 мая 2020

Это выражение соответствует всей строке, а также определяет группу регулярных выражений, т.е. что находится внутри ()

TEXT = "(. *?)"

Regular expression visualization

Debuggex Demo

С помощью Regexmatch вы можете проверить, что есть правильное совпадение во всем выражении, поэтому Regexreplace заменяет все.

Regextract захватывает группу, определенную в регулярном выражении.

Выражение для получения ожидаемого: =REGEXREPLACE(B6,B8, "TEXT=$1") где $ 1 - группа, определенная в регулярном выражении.

...