红移正则表达式匹配
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 。 . .这是一个很好的收获。我用[^ ]*
替换了它——尽管你可能有别的想法。
将其替换为[^ ]
,结果为空白匹配以上是关于红移正则表达式匹配的主要内容,如果未能解决你的问题,请参考以下文章