#regex #google-analytics
#регулярное выражение #google-analytics
Вопрос:
Итак, я пытаюсь создать функцию поиска и замены регулярных выражений, чтобы получить измерение исходного среднего пути из Google Analytics и вернуть значение, совпадающее с исходным средним измерением. Например, когда я смотрю на общее количество конверсий для исходного среднего пути, я получаю такие значения, как:
- google / cpc > google / organic
- google / cpc> google / organic> (прямой) / (нет)
- google / органический
- (нет)> (нет)> (нет) > google / organic > (прямой) / (нет) > (прямой) / (нет)
- (прямое) / (отсутствует)
Это не самый красивый формат, и нашим клиентам будет сложно понять его в своих отчетах, поэтому я хотел бы заменить эти значения эквивалентным исходным / средним измерением:
- google / органический
- google / органический
- google / органический
- google / органический
- (прямое) / (отсутствует)
Функция поиска / замены регулярных выражений, которую я пробовал до сих пор, выглядит так, как будто она работает для всего, кроме # 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/12. Спасибо! это определенно устранило проблему, которую я описал. Однако я понял, что забыл важную деталь: если путь содержит только одну или несколько итераций ‘(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