如何在 impala regex_extract 方法中使用正则表达式 OR 运算并获得不同的捕获组

How to use regex OR operation in impala regex_extract method and get different capture group

我有以下 table1 属性 co:

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

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

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

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

你不能在impala中概括它。就您遇到的问题而言,它需要 OR |在你的正则表达式中实现。使用 regex_extract 您需要输入捕获组号。到底 。例如

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

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

如果 (A)|(B) 是您的正则表达式,那么您的第一个案例捕获组将是 1 并且您的第二个案例捕获组将是 2 。但是你不能把 1 和 2 都放在你的 regex_extract 语法中。

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

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

Watch out the capture groupings

在 link 中,您会看到 "This One" 被捕获为第 2 组 其中 Just this 被捕获为组 1

使用 union 检查这个。

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

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

if(regexp_like(co,'"'),
   regexp_extract(co,'"([^"]*)',1), co)