使用正则表达式从 Google BigQuery 中的 url 中提取参数

Jon*_*onk 2 regex google-bigquery

我可以请您帮忙使用 REGEXP_EXTRACT 构建一个在 Google Big Query 上使用的正则表达式,该表达式将解析由特定键标识的 url 参数的值吗?

假设我要解析的参数的键值等于“source”。解析应该:

  • 确保键之前有“?” 或一个 "&" 之后有一个 "=" : 所以在示例中匹配 "?source=" 或 "&source="
  • 捕获值直到第一个“&”或字符串结尾
  • 如果上述条件匹配不止一次,则应取第一次出现的值

以下是一些所需行为的示例(它们都应该提供“google”作为输出):

  • www.google.com?source=google&medium=cpc --> 输出:google
  • www.google.com?source=google --> 输出:google
  • www.google.com?medium=cpc&source=google --> 输出:google
  • www.google.com?medium=cpc&source=google&keyword=foo --> 输出:google
  • www.google.com?medium=cpc&source=google&keyword=foo&source=bing --> 输出:google
  • www.google.it?medium=cpc?source=goo-gle --> 输出:goo-gle
  • www.google.it?medium=cpc?source=google?med=cpc&keyword=foo --> 输出:google?med=cpc

非常感谢您的帮助!

Who*_*hat 6

[?&]source=([^&]+)

匹配中第一个捕获的组将是“源”参数的值。

  • [?&]无论是?&
  • source= 文字文本
  • ([^&]+) 包含 1 个或多个不属于此类的字符的捕获组 &

  • 非常感谢这适用于所有示例!请问您理解仅使用 REGEXP_EXTRACT(url, r'[?&]source=([^&]+)') 有什么区别?似乎这在我所有的例子中也能很好地工作,但我想一定有一些场景会表现得不同吗?你能提供给我让我完全理解吗?谢谢!马可 (2认同)

Hir*_*ter 5

如果需要从 URL 中提取所有参数,也可以使用REGEXP_EXTRACT_ALL,如下所示:

REGEXP_EXTRACT_ALL(query,r'(?:\?|&)((?:[^=]+)=(?:[^&]*))') as params
Run Code Online (Sandbox Code Playgroud)

(在此发布是因为此问题在 Google 上的“bigquery parse url 查询字符串”排名很高,但所选答案仅适用于已定义的一个参数)。

这将以数组形式返回结果(请参阅如何在 Google BigQuery 中将 URL 参数提取为 ARRAY):

BigQuery 示例