"Match but exclude" 在 amazon Redshift 的 REGEXP_SUBSTR
"Match but exclude" in amazon Redshift's REGEXP_SUBSTR
我已经阅读了很多关于 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
) 之间的内容,但是 从匹配中排除 括号和分号.
目前我正在使用 '\(.*;'
,但它相当基础,感觉很容易 return 匹配错误。
我知道我可以将 returning 匹配与 redshift 的 substring
结合起来,但这样做会导致相当混乱和不可预测的代码。我想知道是否有可能有一个正则表达式匹配 return 只是需要的字符串。
我知道其他可以使用前瞻性的正则表达式可以解决这个问题,但据我所知,它们在 redshift 中不可用。
任何帮助或指点将不胜感激。
嵌套的 SPLIT_PART 完成工作:
SPLIT_PART(SPLIT_PART(user_agent, '(', 2), ';', 1)
它完全符合您的要求,如果您愿意,可以将空 return 视为 NULL 值:
NULLIF(SPLIT_PART(SPLIT_PART(user_agent, '(', 2), ';', 1), '')
我已经阅读了很多关于 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
) 之间的内容,但是 从匹配中排除 括号和分号.
目前我正在使用 '\(.*;'
,但它相当基础,感觉很容易 return 匹配错误。
我知道我可以将 returning 匹配与 redshift 的 substring
结合起来,但这样做会导致相当混乱和不可预测的代码。我想知道是否有可能有一个正则表达式匹配 return 只是需要的字符串。
我知道其他可以使用前瞻性的正则表达式可以解决这个问题,但据我所知,它们在 redshift 中不可用。
任何帮助或指点将不胜感激。
嵌套的 SPLIT_PART 完成工作:
SPLIT_PART(SPLIT_PART(user_agent, '(', 2), ';', 1)
它完全符合您的要求,如果您愿意,可以将空 return 视为 NULL 值:
NULLIF(SPLIT_PART(SPLIT_PART(user_agent, '(', 2), ';', 1), '')