Как упростить это регулярное выражение для использования в Google Analytics - PullRequest
0 голосов
/ 22 ноября 2018

Контекст: Google Analytics

Необходимость: фильтр, который принимает данный URI или URN (да URN), возвращает все до исключенной строки запроса.

Как вы можете себе представить, тамэто множественные варианты, которые, я надеюсь, я полностью охватил приведенным ниже списком:

https://sub.domain.com/path/folder/article?l=en >> expected     https://sub.domain.com/path/folder/article
https://sub.domain.com/path/folder/103#3173l=en >> expected     https://sub.domain.com/path/folder/103   
https://sub.domain.com/path/folder/103?#3173l=en >> expected     https://sub.domain.com/path/folder/103
https://sub.domain.com/path/folder/103#?3173l=en
0sub.domain.tld  >> expected sub.domain.tld
sub.domain.tld/  >> expected sub.domain.tld
sub.domain.tld?param=value  >> expected sub.domain.tld
sub.domain.tld/?param=value  >> expected sub.domain.tld
sub.domain.tld?param=value#id  >> expected sub.domain.tld
sub.domain.tld/?param=value#id  >> expected sub.domain.tld
sub.domain.tld/folder  >> expected sub.domain.tld/folder
sub.domain.tld/folder/  >> expected sub.domain.tld/folder
sub.domain.tld/folder?param=value  >> expected   sub.domain.tld/folder
sub.domain.tld/folder/?param=value  >> expected  sub.domain.tld/folder
sub.domain.tld/1/folder  >> expected      sub.domain.tld/1/folder
sub.domain.tld/1/folder/  >> expected     sub.domain.tld/1/folder
2sub.domain.tld/1/folder?param=value
3sub.domain.tld/1/folder/?param=value
4sub.domain.tld#id
5sub.domain.tld/#id
6sub.domain.tld/1#id
7sub.domain.tld/1/#id

Проблема, которую я не могу решить, - это получить регулярное выражение, совпадающее с вещами в подгруппе, которая всегда одинакова.

Если вам нужно поиграть, я сохранил пару тестов в - https://regex101.com/r/trZl06/1/ - https://regex101.com/r/SetgFn/2

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

Я пробовал также что-то вроде ((.*)(?:[\/]\?.*)|(.*)(?:\?.*))|((.*)\/$|(.*)), но результирующие подгруппы всегдаПо-другому делать ссылку в представлении фильтра немного беспорядочно.

Есть что-нибудь, о чем вы можете подумать?

1 Ответ

0 голосов
/ 23 ноября 2018

Вы можете использовать

^([^#?]*?)([/?#]?\?.*|[/#]?#.*)?(/?)$

См. демонстрационный пример регулярного выражения .

Подробности

  • ^ - начало строки
  • ([^#?]*?) - группа 1: 0 или более символов, отличных от # и ?, как можно меньше
  • ([/?#]?\?.*|[/#]?#.*)? - необязательная группа 2: любой из двух:
    • [/?#]?\?.* - необязательный /, ? или #, за которым следует символ ?, а затем остальная часть строки
    • | - или
    • [/#]?#.* - необязательный / или #, за которым следует символ #, а затем остальная часть строки
  • (/?) - группа 3: необязательно /
  • $ - конец строки.
...