如何编写hive正则表达式以匹配条件1或条件2并返回哪个匹配?

时间:2012-07-06 00:31:11

标签: regex hive

我需要在我的正则表达式中使用“或”逻辑。

  1. 例如,从“foobar435”我需要三个数字,所以“435”
  2. 但是从“barfoo543”我需要三个数字之前的三个字母,所以“foo”
  3. 单独地,正则表达式将是“foobar([0-9]){3}”以获得第一种情况,并且“[a-zA-Z] {3}([0-9] {3}) [a-zA-Z] {3}“得到第二个案例。如何使用一个正则表达式同时获得两个案例?那么,如果第一个正则表达式匹配则返回“435”,但如果不匹配,则返回“foo”?

    我正在使用蜂巢,所以理想情况下我只想打一个电话。到目前为止,我有......

    REGEXP_EXTRACT(myString, 'foobar([0-9]){3}', 1) AS columnName
    

    不确定如何将第二种情况添加到此中。谢谢!

1 个答案:

答案 0 :(得分:2)

您可以使用lookarounds

在您的第一种情况下,您希望匹配前面带有“foobar”的三个数字(使用lookbehind):

(?<=foobar)[0-9]{3}

在你的第二种情况下,你想要匹配前面有三个字母的三个字母(使用lookbehind),然后是三个数字(使用lookahead):

(?<=[a-zA-Z]{3})[a-zA-Z]{3}(?=\d{3})

请注意,如果我正确地解释了您的要求,看起来您在表达式中使用第二个alpha部分翻转了数字部分。

既然你有两个表达式,你只需要将它们与'或'结合起来:

(?<=foobar)[0-9]{3}|(?<=[a-zA-Z]{3})[a-zA-Z]{3}(?=\d{3})

有一点需要注意的是,这也将匹配两端带有附加单词字符的单词,即“xfoobar435x”。如果这是不合需要的,请在lookbehinds的开头和前瞻的末尾添加一个单词边界\b