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 之间的数字
所以上面例子的输出分别是2
和12
【问题讨论】:
试试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
及其后的任何零,然后捕获从1
到9
的数字及其后的任何数字到捕获组中:
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 中的正则表达式