0

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

  1. 例如,从“foobar435”我需要三个数字,所以“435”
  2. 但是从“barfoo543”开始,我需要三个数字之前的三个字母,所以“foo”

单独地,正则表达式将是 "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

不知道如何将第二种情况添加到其中。谢谢!

4

1 回答 1

2

您可以为此使用环视。

在您的第一种情况下,您想匹配前面有“foobar”的三个数字(使用后向):

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

在第二种情况下,您希望匹配三个字母前面三个字母(使用后向查找)和后跟三个数字(使用前瞻):

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

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

现在您有了两个表达式,您只需要将它们与“或”结合起来:

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

要注意的一件事是,这还将匹配两端带有附加单词字符的单词,即“xfoobar435x”。如果不希望这样做,\b请在lookbehinds 的开头和lookahead 的末尾添加一个单词边界。

于 2012-07-06T01:56:26.997 回答