红移正则表达式匹配

Posted

技术标签:

【中文标题】红移正则表达式匹配【英文标题】:Redshift regexp match 【发布时间】:2021-03-05 19:59:57 【问题描述】:

这样的列中有值

NEW_COLUMN
abcd-2020-ab1-01
abcd-2020-ab2-010
abcd-2021-ab1-020
abcd-2021-ab2-125
abcd-2021-ab2-126 abcd-2021-ab2-126 abcd-2021-ab2-126 -- matches all of them
abcd-2021-ab2-126-BC-DEG -- fails to match

问题

我能够正确匹配前 4 条记录。

    使用第 5 个,它会获取所有实例。但是我希望只得到第一个。

    如果我扩展我的正则表达式来匹配这个,原来的匹配失败。有没有办法在正则表达式中进行“或”匹配?喜欢匹配第一个模式或第二个模式。

我的代码

select my_column, regexp_substr(my_column,'[[:word:]]4\-(.*)\-[[:digit:]]1,4') as extracted
from my_table

为了解决第一点,我尝试使用(.*?) 而不是(.*),但redshift 会抛出错误,因为它不支持。任何解决方法都会有所帮助

正则表达式的解释

[[:word:]]4 - 查找前 4 个字符

\- - 找到-

(.*) - 找到直到下一个-的所有内容

\- - 找到-

[[:digit:]]1,4 - 查找 0 到 4 个字符之间的数字

【问题讨论】:

【参考方案1】:

您似乎想匹配第一个字符串,然后只将您的模式视为前缀:

regexp_substr(my_column, '^[[:word:]]4\-([^ ]*)\-[[:digit:]]1,4[^ ]*')

【讨论】:

这仍然给出了多个实例。 (在我的示例中为第 5 行) @PirateX 。 ..我不明白这是怎么可能的。 ^ 将模式锚定到字符串的开头。只有一种模式可以匹配。 . .而且我认为 Redshift 没有重新定义正则表达式。 所以它仍然出现的原因是因为(.*)。它匹配 4 个字符的单词和 4 个字符的数字之间的所有内容。由于第 5 行仍然与此模式匹配,因此它们都显示了 @PirateX 。 . .这是一个很好的收获。我用[^ ]* 替换了它——尽管你可能有别的想法。 将其替换为[^ ],结果为空白匹配

以上是关于红移正则表达式匹配的主要内容,如果未能解决你的问题,请参考以下文章

红移中的正则表达式

正则表达式/红移

如何选择特定范围(使用红移正则表达式)

红移中的正则表达式

亚马逊红移中的 SQL 正则表达式 substr 函数

MySQL正则表达式匹配