【发布时间】:2018-04-27 06:59:03
【问题描述】:
很抱歉在这里问这个问题。但我在 stackoverflow/google 上找不到类似的东西。如果有现有文档,请重新引导我。
我正在尝试使用以下语法使用正则表达式匹配字符串:
select regexp_substr('2018-09-90 88:88:90:900 -0900','([0-9]*-[0-9]*-[0-9]* [0-9]*:[0-9]*:[0-9]*:[0-9]* (\\+|-)[0-9]*)')
效果很好,我得到如下输出:
2018-09-90 88:88:90:900 -0900
但是使用{} 而不是* 返回null。
select regexp_substr('2018-09-90 88:88:90:900 -0900','([0-9]*-[0-9]*-[0-9]* [0-9]*:[0-9]*:[0-9]*:[0-9]* (\\+|-)[0-9][0-9]{2,})')
【问题讨论】:
-
用
[0-9][0-9]+替换[0-9]{2,} -
请注意,如果是 BRE POSIX,则应使用
[0-9]\{2,\}。是 BRE 还是 ERE? -
@WiktorStribiżew:我必须指定位数,因为我想在 where 子句中使用它来过滤掉不需要的时间戳模式。我不确定 Redshift 是 BRE 还是 ERE。我认为是BRE。我尝试使用 \ 和 \\.没有帮助。
-
如果
{2,}和\{2,\}不起作用,则引擎不支持限制量词。您将不得不“手动”重复[0-9]。或者喜欢'...' || REPEAT('[0-9]', 2) || '...' -
真正的问题是:到底为什么要将时间戳值存储在
varchar列中。
标签: regex amazon-redshift