2

我正在尝试REGEXP_EXTRACT在一个语句中构建一个查询,该CASE语句并不能完全按照我想要的方式进行:

示例数据:

1234-ABC
1234-abc
1234-ABC-1a
1234
1234-abc-test-this

我想要的是抓住ABC|abc查询(如果存在)。如果它不存在,我想返回一个默认值。

我找到了一个页面,我可以在其中看到Google-RE2 RegEx的正则表达式可能性。

我知道如何构建案例:

CASE
    WHEN REGEXP_MATCH(Eventcategory, '^([0-9])*-([a-zA-Z0-9])*$') THEN 'it matches 1234-ABC and 1234-abc'
    WHEN REGEXP_MATCH(Eventcategory, '^([0-9])*-([a-zA-Z0-9])*-([a-zA-Z0-9])*') THEN 'it matches 1234-ABC-1a and 1234-abc-test-this'
    ELSE "it matches 1234"
END

问题在于提取Eventcategory.

到目前为止我已经尝试过:

REGEXP_EXTRACT(Eventcategory, '-([a-zA-Z0-9])*-') // Then it was only still needed to remove the - at the beginning and end
REGEXP_EXTRACT(Eventcategory, '-([a-zA-Z0-9])*$') // if it was 1234-Abc
REGEXP_EXTRACT(Eventcategory, '(?=^([0-9])*-)((-[a-zA-Z])*)')
REGEXP_EXTRACT(Eventcategory, '((-[a-zA-Z])*)')
REGEXP_EXTRACT(Eventcategory, '(?=^([0-9])*-)((-[a-zA-Z])*)')
REGEXP_EXTRACT(Eventcategory, '(-([a-zA-Z])+)')
REGEXP_EXTRACT(Eventcategory, '(?=(^([0-9])*-))(-([a-zA-Z])+)')

真的希望有人可以帮助我,因为我目前没有任何选择。

4

1 回答 1

2

为了使您的模式工作,您需要在您需要提取的模式部分周围使用一个捕获组,将其放在*字符类之后并删除$锚点:

'^[0-9]*-([a-zA-Z0-9]*)'

*或者,您还可以通过将(0 或更多)替换为+(1 或更多)来确保匹配每个子模式的至少 1 个字符:

'^[0-9]+-([a-zA-Z0-9]+)'

请参阅正则表达式演示

或者,您可以使用

^[^-]+-([^-]+)

它会匹配

  • ^- 字符串的开始
  • [^-]+- 1 个或多个字符以外的字符-
  • -- 一个连字符
  • ([^-]+)- 第 1 组(您提取的值):1+ 字符以外-

请参阅此正则表达式演示

于 2017-11-08T10:49:40.380 回答