在第一次出现符号之前从字符串中提取文本

Posted

技术标签:

【中文标题】在第一次出现符号之前从字符串中提取文本【英文标题】:Extracting text from a string before the first occurrence of a symbol 【发布时间】:2020-04-20 19:50:37 【问题描述】:

我的数据如下所示-

type       A_URL                          B_URL             C_URL
A         123.com/123abc?....     123.com/123abc?....       123.com/123abc?....
B         pqr.com/435678?....     pqr.com/435678?....       pqr.com/435678?....
C         lmn.com/12u356?....     lmn.com/12u356?....       lmn.com/12u356?....

我想创建一个新的列 URL 并执行以下操作-

if type is A 提取 first '?' 之前的所有内容在 A_URL 列中并将其存储到新列 url,

如果类型是 B,则提取 first '?' 之前的所有内容在 B_URL 列中并将其存储到新列 url,

如果类型是 C,则提取 first '?' 之前的所有内容在 C_URL 列中并将其存储到新列 url

结果应该如下所示-

type       A_URL                          B_URL             C_URL                     url
A         123.com/123abc?....     123.com/123abc?....       123.com/123abc?....     123.com/123abc?
B         pqr.com/435678?....     pqr.com/435678?....       pqr.com/435678?....     pqr.com/435678?
C         lmn.com/12u356?....     lmn.com/12u356?....       lmn.com/12u356?....     lmn.com/12u356?

注意:虽然上面的 A_URL、B_URL 和 C_URL 看起来一样,但在第一个“?”之后的信息不同。存储在其中。

【问题讨论】:

【参考方案1】:

以下是 BigQuery 标准 SQL

#standardSQL
SELECT * EXCEPT(url),
  REGEXP_EXTRACT(url, r'^[^?]+\?') AS url
FROM `project.dataset.table`,
UNNEST([CASE type 
  WHEN 'A' THEN A_URL 
  WHEN 'B' THEN B_URL 
  WHEN 'C' THEN C_URL 
END]) url

【讨论】:

【参考方案2】:

你可以使用regexp_extract():

select t.*,
       regexp_extract(case when type = 'A' then a_url
                           when type = 'B' then b_url
                           when type = 'C' then c_url
                      end,
                      '^[^?]+'

from t;

编辑:

如果你想保留最后的?,那么使用:

select t.*,
       regexp_extract(case when type = 'A' then a_url
                           when type = 'B' then b_url
                           when type = 'C' then c_url
                      end,
                      '^[^?]+[?]'

from t;

【讨论】:

@Gordon_Linoff 谢谢!如果我想包含“?”怎么办?以及在最终的 url 列中? 你会使用'^[^?]+[?]'

以上是关于在第一次出现符号之前从字符串中提取文本的主要内容,如果未能解决你的问题,请参考以下文章

Typescript - 从包含符号的文本中提取字符串[重复]

REGEX - 在字符串之间查找文本 - 第一个可选,但在第一个匹配之前只有第二个

必须通过剥离符号 ^ 字符的最后一次出现以通过正则表达式提取结束来提取单词的开头

使用正则表达式从字符串中提取数字和符号

VBA 代码中的字符变化

使用gsub在R中的空格之前提取字符串