【问题标题】:Regex UTM google正则表达式 UTM 谷歌
【发布时间】:2018-12-06 19:58:19
【问题描述】:

我正在尝试使用 从 Google 链接中提取 UTM,但我的正则表达式似乎无法正常工作。

这里是一个谷歌链接的例子:

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

我尝试了以下正则表达式来提取TOTO

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

没有成功。

如果有人可以帮忙,谢谢!

【问题讨论】:

  • 你试过什么 R 代码?

标签: r r regex utm


【解决方案1】:

在您的模式中,[[a-z]]+ 是一个格式错误的括号表达式,因为它匹配来自 [[a-z] 括号表达式的任何字符(任何小写 ASCII 字母或 [),然后匹配一个或多个 ] 字符。您的意思是在这里使用单个 []

您可以将sub 与以下正则表达式一起使用:

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

请参阅regex demo

详情

  • .* - 任何 0+ 个字符,尽可能多
  • [&?] - ?&
  • utm_campaign= - 文字子字符串
  • ([^&]+) - 捕获组 1:除 & 字符之外的一个或多个字符
  • .* - 任何 0+ 个字符,尽可能多

\1 是将第 1 组的内容放入结果中的替换反向引用。

R demo

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

【讨论】:

    【解决方案2】:

    你可以使用:

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

    并使用第一组捕获

    Try it Online

    【讨论】:

    • 请注意,如果utm_campaign 是第一个查询字符串参数,它前面将有?,因此(?:&amp;utm_campaign=)(\w+) 可能不适用于所有情况。此外,请注意(?:&amp;utm_campaign=) = &amp;utm_campaign=
    【解决方案3】:

    这是一个匹配utm_campaign 参数值的正则表达式字符串,无论其在查询字符串中的位置如何。

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

    解释:

    • ?&lt;TOTO&gt; 在执行正则表达式后将结果捕获到TOTO 键中

    • (?&lt;=utm_campaign=) 是一个look-behind,将确保值前面是utm_campaign=

      • .*? 将找到参数值(即TOTO)。 ? 的原因是惰性评估 - 它只会搜索直到匹配下一个规则(见下文)

      • (?=&amp;|$) 是一个前瞻,它将匹配&amp; 或字符串的结尾(如果utm_campaign 是最后一个参数)

    【讨论】:

      【解决方案4】:

      您正在搜索[[a-z]]+,但TOTO 是大写字母,因此不在“a”和“z”之间。您可以将其更新为 [[A-Za-z]]+ 以匹配任何大小写字母。

      编辑: [[A-Za-z]]+ 将匹配任何大小写字母,但也将匹配任何 '[' 或 ']' 字符。如果您不想匹配这些,则可以将其更改为 [A-Za-z]+ 以仅匹配任何大小写字母

      【讨论】:

      • [[A-Za-z]]+ 匹配来自[[A-Za-z] 括号表达式的任何字符(任何ASCII 字母或[),然后匹配一个或多个] 字符(例如[]]]]]]]]]]]]]]]]]] 类似字符串)。
      • 是的,但是它最初是这样写的,所以我认为它是这样设计的。
      • 感谢您指出这个错误,我已经编辑了我的答案来解决这个问题。
      猜你喜欢
      • 1970-01-01
      • 2022-11-21
      • 1970-01-01
      • 2022-10-14
      • 1970-01-01
      • 2020-03-06
      • 2021-08-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多