用于获取字符内的字符串的正则表达式,Presto/Athena 中的第一个字符集是可选的

问题描述

我整天都在纠结这个问题。我让它在各种在线正则表达式工具中工作,但每当我在查询中使用它时,结果都是错误的。

我的数据库中有这样的数据:

AMAZON PAYMENTS EUROPE S.C.A.
1/asdfL GE#EFRDA^9212 GRIFF
Frau HUSEL G^9212 GRIFF

我想提取 1/^ 中存在的文本。像这样:

AMAZON PAYMENTS EUROPE S.C.A.
asdfL GE#EFRDA
Frau HUSEL G

我尝试了很多变体,它们都可以在线运行:

  • 非捕获组:^(?:1\/)?(.*?(?=\^|$))
  • 向后看:(?<=1\/)(.*?(?=\^|$))
  • 条件表达式:(?(?=^1)1/(.*?(?=\^|$))|((^.*?(?=\^|$))))

但是当我在 AWS 中运行查询时,我总是会在提取物中取回 1/

有人知道如何解决这个问题吗?

解决方法

我会在这里使用 REGEXP_REPLACE

regexp_replace([column],'^(?:[^/]*/)?([^^]*)\^.*','$1')

参见regex demo

详情

  • ^ - 字符串的开始
  • (?:[^/]*/)? - 一个可选序列,匹配除 // 字符以外的任何零个或多个字符
  • ([^^]*) - 捕获组 1(从带有 $1 的替换模式中引用):除 ^ 之外的任何零个或多个字符
  • \^ - 文字 ^ 字符
  • .* - 字符串的其余部分。