Regex для захвата всего до шаблона в Google Sheets - PullRequest
0 голосов
/ 08 сентября 2018

Мне трудно разобраться в коде регулярных выражений в Google Sheets, чтобы проверить ячейку, затем вернуть все, включая новые строки \n, и возвращает \r до определенного шаблона \*+.

Немного больше предыстории: я использую формат REGEXEXTRACT(A:A,"...") внутри большего ArrayFormula, чтобы он автоматически обновлялся при добавлении новой строки. Этот работает правильно. Это только часть регулярного выражения, с которой у меня проблемы.

Итак, для целей этого вопроса, скажем, я беспокоюсь только о том, чтобы извлечь данные из ячейки A1 до определенного шаблона и вернуть это значение в ячейку B1. Что приводит нас к этому коду в ячейке B1:

REGEXEXTRACT(A1,"...")

Например, так выглядит моя ячейка A1:

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus accumsan risus id ex dapibus sodales. 

Curabitur dui lacus, tincidunt vel ligula quis, volutpat mattis eros. 

In quis metus at ex auctor lobortis. Aliquam sed nisi purus. Sed cursus odio erat, ut tristique sapien interdum interdum. Morbi vel sollicitudin ante, non pellentesque libero. 

***********

Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Aenean egestas urna facilisis massa posuere, quis accumsan erat ornare. 

Curabitur at dapibus nibh. Nam nec vestibulum ligula. Phasellus bibendum mi urna, ac hendrerit libero interdum non. Suspendisse semper non elit aliquam auctor. 

Morbi vel sem tortor. Donec a sapien quis erat condimentum consequat in ut sem. Quisque in tellus sed est lobortis ultricies sed vitae enim.

Я хочу вернуть это значение в B1:

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus accumsan risus id ex dapibus sodales. 

Curabitur dui lacus, tincidunt vel ligula quis, volutpat mattis eros. 

In quis metus at ex auctor lobortis. Aliquam sed nisi purus. Sed cursus odio erat, ut tristique sapien interdum interdum. Morbi vel sollicitudin ante, non pellentesque libero. 

Что, по сути, является чем-то еще до шаблона *******. В Python я могу добавить re.DOTALL к .*, но я не могу заставить это работать в Google Sheets.

Ответы [ 4 ]

0 голосов
/ 08 сентября 2018
0 голосов
/ 08 сентября 2018

Не регулярное выражение, хотя может подойти кому-то, желающему того же результата, но менее детально о методе:

  =ArrayFormula(LEFT(A1:A,Find("***********",A1:A)-3))
0 голосов
/ 08 сентября 2018

Если вы действительно хотите сопоставить все до первого *:

=REGEXEXTRACT(A1;"[^*]*")

Если вы хотите разрешить одну звезду в тексте и останавливаться только на нескольких (2 или более) звездах (возможно, разделенныхв начале строки, вы можете попробовать:

=REGEXEXTRACT(A1;"(?s)^(.*)\n(\*\n?){2,}")

Но вам придется раздеть звезды.Например,

=REGEXREPLACE(REGEXEXTRACT(A1;"(?s)^(.*)\n(\*\n?){2,}"); "\n(\*\n?){2,}"; "")

. Кажется, в Google Sheets прогноз не работает.

0 голосов
/ 08 сентября 2018

Чтобы сделать точечные разрывы линий, вам нужно добавить (?s) к шаблону. Чтобы соответствовать любому символу, вы можете использовать .. Для сопоставления до самого левого вхождения используйте ленивый квантификатор *?. Чтобы на самом деле извлечь нужную вам подстроку, оберните часть шаблона, которую вы хотите получить, с помощью скобок.

Таким образом, чтобы соответствовать первой подстроке *******, вы можете использовать

(?s)^(.*?)\*\*\*\*\*\*\*

или (?s)^(.*?)\*{7}. См. Демонстрационную версию regex (обратите внимание, что движком Go regex также является RE2, так что вы можете проверить свои паттерны там, на regex101.com).

  • (?s) - модификатор DOTALL
  • ^ - начало строки
  • (.*?) - Группа 1: любые 0+ символов, как можно меньше
  • \*\*\*\*\*\*\* - 7 буквенных звездочек.

Обратите внимание, что вы не можете полагаться на отрицательный символьный класс (который соответствует разрывам строк), если ваша подстрока может содержать * символов, то есть ^([^*]*)\*\*\*\*\*\*\* не будет работать в этих случаях.

Если вы просто хотите сопоставить любые символы до первого * в строке, ваше регулярное выражение значительно упростится до

^([^*]+)

Это соответствует

  • ^ - начало строки
  • ([^*]+) - Группа захвата 1: один или несколько символов, отличных от *.
...