亚马逊 Redshift 的 REGEXP_SUBSTR 中的“匹配但排除”

Posted

技术标签:

【中文标题】亚马逊 Redshift 的 REGEXP_SUBSTR 中的“匹配但排除”【英文标题】:"Match but exclude" in amazon Redshift's REGEXP_SUBSTR 【发布时间】:2019-03-21 15:02:30 【问题描述】:

我已经阅读了很多关于 REGEX 的问题和信息,但还没有找到任何结论。

我在亚马逊红移中使用REGEXP_SUBSTR,根据文档使用正则表达式风格POSIX。我的理解是它是相当基本的,不能向前看。

有什么方法可以匹配模式但排除开头或结尾的字符?

我正在尝试解析我们数据库中的 user_agent 字段,这真的很有帮助。

示例

示例字符串 1:'Mozilla/5.0 (iPhone; CPU iPhone...' 希望匹配:iPhone

示例字符串 2:'Mozilla/5.0 (Windows NT 10.0; Win64; ...' 希望匹配:Windows NT 10.0

我正在尝试匹配第一个括号和后面的分号 (iPhone) 之间的内容,但排除括号和分号。

目前我使用的是'\\(.*;',但它相当基础,感觉很容易返回错误的匹配项。

我知道我可以将返回的匹配与 redshift 的 substring 结合起来,但这样做会导致代码相当混乱且不可预测。我想知道是否有可能有一个正则表达式匹配只返回所需的字符串。

我知道可以使用前瞻的其他正则表达式可以解决这个问题,但据我所知,它们在 redshift 中不可用。

任何帮助或指针将不胜感激。

【问题讨论】:

【参考方案1】:

嵌套的 SPLIT_PART 完成这项工作:

SPLIT_PART(SPLIT_PART(user_agent, '(', 2), ';', 1)

它完全符合您的要求,如果您愿意,可以将空返回视为 NULL 值:

NULLIF(SPLIT_PART(SPLIT_PART(user_agent, '(', 2), ';', 1), '')

【讨论】:

以上是关于亚马逊 Redshift 的 REGEXP_SUBSTR 中的“匹配但排除”的主要内容,如果未能解决你的问题,请参考以下文章

使用 json 的亚马逊 redshift 副本遇到问题

sql 亚马逊Redshift日历表

亚马逊 Redshift 的 REGEXP_SUBSTR 中的“匹配但排除”

如何实现对亚马逊 Redshift 的原始 sql 访问的行级安全性 (RLS)?

如何将oracle sql复制到亚马逊redshift

如何使用 Amazon Redshift 中的临时表列更新现有表中的列?