Regex удаляет 2 раздела URL одновременно - PullRequest
3 голосов
/ 14 марта 2020

У меня есть следующие возможные URL:

https://letterboxd.com/username/film/sometitle/
https://letterboxd.com/username59/film/sometitle/1/
https://letterboxd.com/username59/film/sometitle/2/

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

https://letterboxd.com/film/sometitle/

Я могу удалить конечный номер, где он существует, с помощью этого:

=IF(REGEXMATCH(A2,"/film/(.*?)/\d/"), left(A2,len(A2)-2), A2)

результат: https://letterboxd.com/username59/film/sometitle/ Я должен быть здесь осторожен, потому что если название фильма просто ди git, я не хочу его замену, поэтому я указал, что между / film / и последним di git должно быть содержимое. (например, я должен различать guish между film/9/ и film/sometitle/9/

Я могу удалить это имя пользователя (хотя, вероятно, мне придется приходите думать о других типах персонажей, если подумать):

=REGEXREPLACE(A2, regexextract(A2, "\/[A-Za-z0-9]+\/"),"/")

результат: https://letterboxd.com/film/sometitle/2/

❌ Но я не могу на всю жизнь понять, как комбинировать и то, и другое - в одной формуле! Я могу выполнить одну из формул по результатам другой, но не могу объединиться, чтобы все это было сделано за один раз. oop. Я перепробовал слишком много комбинаций. перечислить здесь, но этот, который я считаю наиболее перспективным:

=REGEXREPLACE(A2, REGEXEXTRACT(IF(REGEXMATCH(A2,"/film/(.*?)/\d/"), left(A2,len(A2)-2), A2),"\/[A-Za-z0-9]+\/"),"/")

результат: https://letterboxd.com/film/sometitle/2/

Он не позаботился о конце 2/, и я не не знаю почему. Я предполагаю, что это связано с некоторой формой округлости или порядком вещей?

Ответы [ 6 ]

2 голосов
/ 14 марта 2020

Попробуйте это:

=REGEXREPLACE(A2, "\/[^\/]+(\/film\/[^\/]+\/)[\d\/]*", "$1")

Здесь вы можете увидеть шаблон соответствия регулярных выражений .

enter image description here

1 голос
/ 14 марта 2020

Вы можете использовать 2 группы захвата, чтобы захватить то, что вы хотите сохранить, и использовать 2 группы в замене.

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

(https?:\/\/[^\/]+)\/[^\/]+(\/film\/[^\/]+)(?:\/\d+)?

Пояснение

  • ( Захват группа 1
    • https:\/\/[^\/]+ Совпадение http, необязательные s и ://. Затем 1+ раз любой символ кроме /
  • ) Закрыть группу 1
  • \/[^\/]+ Совпадение / и 1+ раз любой символ кроме /
  • ( Захват группа 2
    • \/film\/[^\/]+ Совпадение /film/ и 1+ раз с любым символом, кроме /
  • ) Закрыть группу 2
  • (?:\/\d+)? Соответствовать необязательно / и 1+ цифры

Regex demo

В замене используйте

$1$2
1 голос
/ 14 марта 2020

Альтернативным (не регулярным) способом может быть:

=substitute(join("/", query(split(A2, "/"), "Select Col1, Col2, Col4, Col5"))&"/", ":", ":/")

и посмотреть, работает ли это?

1 голос
/ 14 марта 2020

Это регулярное выражение должно соответствовать тому, что вам нужно. Основное предположение заключается в том, что вам ничего не нужно после третьего / после ДВУ.

(https?\:\/\/(?:\w*?\.\w+?)*\/(?:.*?\/){3})
  • https?\:\/\/(?:\w*?\.\w+?) Эта часть предназначена для URL и TLD.
  • *\/(?:.*?\/){3} Это захватывает что-либо до 3-го / и ничего после этого.

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

0 голосов
/ 14 марта 2020

Это регулярное выражение также соответствует тому, что вам нужно:

   C4=REGEXREPLACE(A4,"(\/user[^\/]+|\d+\/$)","")

Демо.

  1. /user[^\/]+ -> совпадение с именем пользователя ... до " / "
  2. \d+\/$ -> соответствует последнему числу в конце строки.

enter image description here

enter image description here

0 голосов
/ 14 марта 2020

Вот регулярное выражение, которое работает:

https:\/\/([^\/]+)\.com/([^\/]+)/([^\/]+)/([^\/]+)/((\d)+\/)?

Отсюда вы получаете:

Группа1: letterboxd.com

Группа3: film

Группа: sometitle

...