REGEXP_EXTRACT 在 Bigquery 中具有字符串值

REGEXP_EXTRACT with String Value in Bigquery

我想提取列中的单词,列值如下所示:'p-fr-youtube-car'。而且它们应该都被提取到它们自己的列中。

输入:

p-fr-youtube-car

期望输出

Country = fr
Channel = youtube
Item = car

我在下面尝试提取第一个单词,但无法确定 rest.What RegEx 是否可以从此输入中获得我想要的输出?我怎样才能让它不区分大小写 fr 和 FR 将相同。

REGEXP_EXTRACT_ALL(CampaignName, r"^p-([a-z]*)") AS Country

您可以使用命名组。

正则表达式示例:

p-(?P<Country>[a-z]*)\-(?P<Channel>[a-z]*)\-(?P<Item>[a-z]*)$

https://regex101.com/r/fKoBIn/3

您可以使用 [^-]+ 来匹配连字符之间的部分,并且只捕获您需要获取的内容。

要获取像 youtube 这样的字符串,您可以使用

REGEXP_EXTRACT_ALL(CampaignName, r'^p-[^-]+-([^-]+)')

要获取像 car 这样的字符串,您可以使用

REGEXP_EXTRACT_ALL(CampaignName, r'^p-[^-]+-[^-]+-([^-]+)')

所以,[^-]+ 匹配除 - 之外的一个或多个字符,而 ([^-]+) 是用捕获组包装的相同模式,其内容 REGEXP_EXTRACT 实际上 returns 结果。

以下适用于 BigQuery 标准 SQL

我建议在像您这样的情况下使用 SPLIT

#standardSQL
SELECT CampaignName, 
  parts[SAFE_OFFSET(1)] AS Country,
  parts[SAFE_OFFSET(2)] AS Channel,
  parts[SAFE_OFFSET(3)] AS Item
FROM `project.dataset.table`,
UNNEST([STRUCT(SPLIT(CampaignName, '-') AS parts)])   

如果应用于您问题中的示例数据 - 输出是

Row CampaignName        Country     Channel     Item     
1   p-fr-youtube-car    fr          youtube     car     

同时,如果出于某种原因您需要使用 Regexp - 您可以使用下面的方法

#standardSQL
SELECT CampaignName, 
  parts[SAFE_OFFSET(1)] AS Country,
  parts[SAFE_OFFSET(2)] AS Channel,
  parts[SAFE_OFFSET(3)] AS Item
FROM `project.dataset.table`,
UNNEST([STRUCT(REGEXP_EXTRACT_ALL(CampaignName, r'(?:^|-)([^-]*)') AS parts)])