【问题标题】:Repeat POSIX quantifier not working in Amazon Redshift重复 POSIX 量词在 Amazon Redshift 中不起作用
【发布时间】: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


【解决方案1】:

您确认[0-9]{2,}[0-9]\{2,\} 都不适合您。

这意味着,您的正则表达式库不支持它,或者它已损坏。

要解决这个问题,您可以使用REPEAT 函数重复一个模式:

[0-9]{m}    = REPEAT('[0-9]', m)
[0-9]{m,}   = REPEAT('[0-9]', m) || '[0-9]*'
[0-9]{m,n}  = REPEAT('[0-9]', m) || CONCAT(REPEAT('[0-9]?', n-m))

你的模式可以很容易地重写为

'([0-9]*-[0-9]*-[0-9]* [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 个数字,后跟 0 或更多)。

【讨论】:

  • 感谢@Wiktor。虽然,我不需要使用您提供的解决方案,因为我使用的 sql 工作台存在一些问题。我尝试使用 RazorSQL,它工作得非常好。再次感谢您的宝贵时间!
猜你喜欢
  • 2019-02-24
  • 2017-06-04
  • 1970-01-01
  • 2016-06-16
  • 2020-10-26
  • 2018-04-22
  • 1970-01-01
  • 2020-09-11
  • 2015-04-01
相关资源
最近更新 更多