Amazon redshift 在字符串正则表达式后获取数字

Posted

技术标签:

【中文标题】Amazon redshift 在字符串正则表达式后获取数字【英文标题】:Amazon redshift get numbers after string regex 【发布时间】:2020-01-29 11:59:20 【问题描述】:

从一个公开的例子中我们得到了这个:

select email, regexp_replace( email, '@.*\\.(org|gov|com)$') 
from users limit 5; 

              email                | regexp_replace 
-----------------------------------+----------------  
  DonecFri@semperpretiumneque.com  | DonecFri
  mk1wait@UniOfTech.org            | mk1wait
  sed@redshiftemails.com           | sed
  bunyung@integermath.gov          | bunyung

就我而言,我有这样的字符串:

ABCD01E002C
ABCSDD01E12C

我想在 E 字符之后检索 1 到 9 之间的数字 所以上面例子的输出分别是212

【问题讨论】:

试试REGEXP_SUBSTR(email, 'E0*([1-9][0-9]*)', 1, 1, 'e') @MiguelSantos wiktor 更新了他的评论,我想你试试最新的它会起作用 它确实有效,您能否制定一个正式的答案,以便我可以将其标记为正确? @WiktorStribiżew 好吧,regex101.com/r/525m5D/1 表明它应该适用于 ABCD01E002C 米格尔你已经接受了答案,但你是说它还不行吗? 【参考方案1】:

您可以使用REGEXP_SUBSTR 匹配E 及其后的任何零,然后捕获19 的数字及其后的任何数字到捕获组中:

REGEXP_SUBSTR(email, 'E0*([1-9][0-9]*)', 1, 1, 'e')

e 参数告诉REGEXP_SUBSTR 返回第一个捕获的值。

见regex demo

模式详情

E - 一封信 E 0* - 零个或多个 0 字符 ([1-9][0-9]*) - 捕获组 #1: [1-9] - 非零数字 [0-9]* - 任何 0 个或多个数字

【讨论】:

如果我删除了 E 之后的 0,你能解释一下为什么在这个例子中它返回 1:ABCD01E002C 而不是 2 @MiguelSantos 不可能,因为E不能匹配D REGEXP_SUBSTR(email, 'E*([1-9][0-9]*)', 1, 1, 'e') 此示例 ABCD01E002C 的此表达式返回 1 @MiguelSantos 不应该这样。 @MiguelSantos 我有,在任何地方捕获的数据中都没有1

以上是关于Amazon redshift 在字符串正则表达式后获取数字的主要内容,如果未能解决你的问题,请参考以下文章

在 SQL (Amazon Redshift) 中使用正则表达式提取标签

使用 SQL 的 Amazon Redshift 中的正则表达式

Redshift中的英国邮政编码区

正则表达式:获取 AWS Redshift 中两个字符串之间的值

正则表达式字符串脱离 Redshift

Redshift 正则表达式匹配直到模式匹配但不包含模式