регулярное выражение UTM гугл

Я пытаюсь извлечь UTM из ссылки Google, используя r, но мое регулярное выражение работает неправильно.

Вот пример ссылки на гугл:

xxx/yyy?utm_medium=display&utm_source=ogury&utm_campaign=TOTO&zzz=coco

Я попробовал следующее регулярное выражение для извлечения TOTO:

.+&utm_campaign=([[a-z]]+)&.+

без успеха.

Если кто-то может помочь, спасибо!


person Alex Paris    schedule 27.06.2018    source источник
comment
Какой R-код вы пробовали?   -  person SeGa    schedule 27.06.2018


Ответы (4)


В вашем шаблоне [[a-z]]+ является выражением в скобках неправильного формата, потому что оно соответствует любому символу из выражения в скобках [[a-z] (любой строчной букве ASCII или [), а затем соответствует одному или нескольким символам ]. Вы хотели использовать одиночные [ и ] здесь.

Вы можете использовать sub со следующим регулярным выражением:

sub(".*[&?]utm_campaign=([^&]+).*", "\\1", s)

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

Подробнее

  • .* - любые символы 0+, как можно больше
  • [&?] - a ? or &
  • utm_campaign= - литеральная подстрока
  • ([^&]+) — группа захвата 1: один или несколько символов, отличных от & символов
  • .* - любые символы 0+, как можно больше

\1 — это замещающая обратная ссылка, которая помещает содержимое группы 1 в результат.

См. демонстрацию R:

s <- "xxx/yyy?utm_medium=display&utm_source=ogury&utm_campaign=TOTO&zzz=coco"
sub(".*[&?]utm_campaign=([^&]+).*", "\\1", s)
## => [1] "TOTO"
person Wiktor Stribiżew    schedule 27.06.2018

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

(?:&utm_campaign=)(\w+)

и используйте захваченную первую группу

Попробовать онлайн

person Matheus Cuba    schedule 27.06.2018
comment
Обратите внимание, что если utm_campaign является первым параметром строки запроса, перед ним будет стоять ?, поэтому (?:&utm_campaign=)(\w+) может работать не во всех случаях. Кроме того, обратите внимание, что (?:&utm_campaign=) = &utm_campaign=. - person Wiktor Stribiżew; 27.06.2018

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

(?<TOTO>(?<=utm_campaign=).*?(?=&|$))

Объяснение:

  • ?<TOTO> записывает результат в ключ TOTO после выполнения регулярного выражения

  • (?<=utm_campaign=) — это просмотр назад, который гарантирует, что перед значением стоит utm_campaign=.

    • .*? найдет значение параметра (т.е. TOTO). Причиной ? является ленивая оценка - поиск будет выполняться только до тех пор, пока не будет найдено соответствие следующему правилу (см. пункт ниже).

    • (?=&|$) — это поиск вперед, который будет соответствовать либо &, либо концу строки (в случае, если utm_campaign является последним параметром)

person Joobsies    schedule 27.06.2018

Вы ищете [[a-z]]+, однако TOTO в верхнем регистре, а не между «a» и «z». Вы можете обновить его до [[A-Za-z]]+, чтобы он соответствовал любой букве регистра.

EDIT: [[A-Za-z]]+ будет соответствовать любой букве регистра, но также будет соответствовать любым символам '[' или ']'. Если вы не хотите сопоставлять их, вы можете изменить его на [A-Za-z]+, чтобы совпадать только с любыми буквами регистра.

person Jacob Boertjes    schedule 27.06.2018
comment
[[A-Za-z]]+ соответствует любому символу из выражения скобки [[A-Za-z] (любая буква ASCII или [), а затем соответствует одному или нескольким символам ] (например, []]]]]]]]]]]]]]]]]] как строки). - person Wiktor Stribiżew; 27.06.2018
comment
Да, однако это было написано изначально, поэтому я предположил, что так оно и было задумано. - person Jacob Boertjes; 27.06.2018
comment
Спасибо, что указали на эту ошибку, я отредактировал свой ответ, чтобы решить эту проблему. - person Jacob Boertjes; 27.06.2018