Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 正则表达式:如何在几个冒号之间获取文本?_Sql_Regex_Google Bigquery - Fatal编程技术网

Sql 正则表达式:如何在几个冒号之间获取文本?

Sql 正则表达式:如何在几个冒号之间获取文本?,sql,regex,google-bigquery,Sql,Regex,Google Bigquery,因此,我的数据库中有很多字符串,如下所示: product1:1stparty:single\u aduls:android: 产品2:3第三方:已婚\成人:ios: 产品3:3第三方:其他成人:android: 我需要一个正则表达式来只获取产品名称之后和设备类别之前的文本。因此,在第一行中,我得到了第1方:单身成年人,第二方:已婚成年人,第三方:其他成年人。我陷入困境,找不到解决的办法。有人能帮我吗?作为正则表达式,您可以使用: select regexp_extract('product1:

因此,我的数据库中有很多字符串,如下所示:

product1:1stparty:single\u aduls:android:

产品2:3第三方:已婚\成人:ios:

产品3:3第三方:其他成人:android:


我需要一个正则表达式来只获取产品名称之后和设备类别之前的文本。因此,在第一行中,我得到了第1方:单身成年人,第二方:已婚成年人,第三方:其他成年人。我陷入困境,找不到解决的办法。有人能帮我吗?

作为正则表达式,您可以使用:

select regexp_extract('product1:1stparty:single_aduls:android:', '^[^:]*:(.*):[^:]*:$')

这将在第一个冒号之后和倒数第二个冒号之前返回一次。

我们可以在此处尝试使用
REGEXP\u REPLACE

选择REGEXP_REPLACE(val,r“^.*?:|:[^:::+:$”,“”)作为输出
从你的桌子上;
此方法从列中删除前导的
…:
或尾随的
:…:
,留下所需的内容。下面是一个演示,显示正则表达式的替换正在工作:

您还可以使用标准函数并通过索引访问结果数组元素,这非常清楚易懂

with a as (
  select split('product1:1stparty:single_aduls:android:', ':') as splitted
)
select splitted[ordinal(2)] || ':' || splitted[ordinal (3)] as subs
from a
考虑下面的例子

with your_table as (
  select 'product1:1stparty:single_aduls:android:' txt union all
  select 'product2:3rdparty:married_adults:ios:' union all
  select 'product3:3rdparty:other_adults:android:' 
)
select *, 
  (
    select string_agg(part, ':' order by offset)
    from unnest(split(txt, ':')) part with offset 
    where offset in (1, 2)
  ) result
from your_table     
有输出


你试过了吗?这对你有用吗?!如果有帮助,就考虑投票。如果你觉得合适就接受