在第一次出现符号之前从字符串中提取文本
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 - 在字符串之间查找文本 - 第一个可选,但在第一个匹配之前只有第二个