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

时间:2019-03-21 15:02:30

标签: regex posix amazon-redshift regex-lookarounds

我一直在阅读很多关于REGEX的问题和信息,但还没有确定的结论。

我在Amazon redshift中使用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 个答案:

答案 0 :(得分:1)

嵌套的SPLIT_PART可以完成工作:

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

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

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