Регулярное выражение для исходного среднего пути в Google Analytics

#regex #google-analytics

#регулярное выражение #google-analytics

Вопрос:

Итак, я пытаюсь создать функцию поиска и замены регулярных выражений, чтобы получить измерение исходного среднего пути из Google Analytics и вернуть значение, совпадающее с исходным средним измерением. Например, когда я смотрю на общее количество конверсий для исходного среднего пути, я получаю такие значения, как:

  1. google / cpc > google / organic
  2. google / cpc> google / organic> (прямой) / (нет)
  3. google / органический
  4. (нет)> (нет)> (нет) > google / organic > (прямой) / (нет) > (прямой) / (нет)
  5. (прямое) / (отсутствует)

Это не самый красивый формат, и нашим клиентам будет сложно понять его в своих отчетах, поэтому я хотел бы заменить эти значения эквивалентным исходным / средним измерением:

  1. google / органический
  2. google / органический
  3. google / органический
  4. google / органический
  5. (прямое) / (отсутствует)

Функция поиска / замены регулярных выражений, которую я пробовал до сих пор, выглядит так, как будто она работает для всего, кроме # 4, где Путь заканчивается несколькими итерациями ‘direct / (none)’ и ошибочно выводит ‘(direct) / (none)’ вместо ‘google / organic’.

По сути, это должно найти последний источник / носитель в пути (т. Е. «google / organic» в 1 и 3), если последняя группа не является «(прямой) / (нет)» (как в 2/4/5), и в этом случае следует использовать последнюю группу, которая не является «(направляйте) / (нет)’ и заменяйте на источник / носитель, если только путь не содержит только одну или несколько итераций ‘(direct) / (none)’, и в этом случае его следует заменить значением ‘(direct) / (none).

Буду признателен за любую помощь в том, как я могу это исправить! Смотрите ниже, что у меня есть до сих пор:

Найти: ^(.* / .* > )*(?'foo'.* / .*) > (direct / (none)) $|^(.* / .* > )(?'var'.* / .*)$

заменить на: ${foo}${var}

Комментарии:

1. Попробуйте ^(?:(?:(none) > ) |(?:w / w > ))?(w / w )(?!S).* заменить на group 1 см. regex101.com/r/L6MnWN/1

2. Спасибо! это определенно устранило проблему, которую я описал. Однако я понял, что забыл важную деталь: если путь содержит только одну или несколько итераций ‘(direct) / (none)’, то он должен заменить это значение просто ‘(direct) / (none)’. Например: (прямой) / (нет)> (прямой) / (нет)> (прямой) / (нет) и (прямой) / (нет) оба должны быть заменены на ‘(прямой) / (нет)’. Я пытаюсь понять, как заставить это работать с тем, что вы предоставили, но любая помощь была бы очень признательна!

3.Нравится это? ^(?:(?:(none) > ) |(?:w / w > ))?(w / w |(direct) / (none))(?!S).* regex101.com/r/NQrhXr/1

Ответ №1:

Вы можете использовать шаблон, чтобы при необходимости сопоставить предыдущие части с символами none или word, за которыми следуют / и >

Затем используйте группу захвата для (none) > (none) части или word / word части и используйте ее при замене.

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

 ^(?:(?:(none) > ) |(?:w  / w  > ))?(w  / w |(direct) / (none))(?!S).*
  

Демонстрация регулярных выражений

При замене используйте группу 1 $1

Комментарии:

1. Еще раз спасибо! Похоже, это работает для всех путей, кроме одного: google / organic> (прямой) / (нет)> (прямой) / (нет) это должно быть заменено на «google / organic», но теперь оно заменяется на «(прямой) / (нет)». Похоже, это должно быть достаточно простым решением, но я еще не совсем смог его взломать.

2. @aceetobee Нравится это? ^.*?(S / S )(?!.*w / w).* См. regex101.com/r/plE18U/1