如何在impala regex_extract方法中使用regex OR操作并获取不同的捕获组

问题描述 投票:1回答:3

我有以下table1属性co

|-----------------------------------------
| co
|-----------------------------------------
| fsdsdf "This one" fdsfsd ghjhgj "sfdsf"
| Just This 
|-----------------------------------------

如果有引号 - 我想获得第一个出现的内容。如果没有引号,我想按原样返回内容。对于上面的例子:对于第一行 - This one对于第二行 - Just This我在Impala中有SQL代码解决了第一种情况:

select regexp_extract (co, '"([^"]*")',1) from table1

如何概括它以检测并返回下一个案例所需的结果?

sql regex impala
3个回答
1
投票

你不能在黑斑羚中概括它。至于您遇到的问题需要OR |在你的正则表达式中实现。使用regex_extract,您需要将捕获组设为no。到底 。例如

select regexp_extract (co, '"([^"]*")',1) from table1

但是|正则表达式中的操作数,捕获组对于这两种情况都必须是不同的。您无法在regex_extract方法中定义。

假设(A)|(B)是你的正则表达式,那么你的第一个案例捕获组将是1,而你的第二个案例捕获组将是2。但是你不能在你的regex_extract语法中同时放置1和2。

通用正则表达式语法将是(我认为在impala分组中不起作用):

^(?!.*")(.*)$|^[^"]*"(.*?)".*$

Watch out the capture groupings

在链接中,您将看到“This One”被捕获为第2组,其中就是将其作为第1组捕获


1
投票

使用union检查这个。

 select regexp_extract (co, '"([^"]*")',1) from table1
 union
 select co from table1 where co like '"%"'

1
投票

您可以使用if函数并将RegEx函数放入参数中。所以,

if(regexp_like(co,'"'),
   regexp_extract(co,'"([^"]*)',1), co)
© www.soinside.com 2019 - 2024. All rights reserved.