Redshift中使用Regex提取嵌套括号内目标字符串的方法咨询
Redshift 正则提取嵌套括号最内层指定内容方案
问题原因
你之前使用的正则\((.*?)\)采用非贪婪匹配规则,会从字符串第一个左括号开始匹配,遇到第一个右括号就停止捕获,因此只能拿到最外层左括号到首个右括号的内容,和预期提取最内层括号内容的需求不符。
可用解决方案
方案1:一步提取(推荐)
利用正则贪婪匹配特性直接定位到整个字符串最后一个左括号(也就是最内层括号的左边界),再捕获第一个逗号前的目标内容,Redshift 中写法如下:
REGEXP_EXTRACT(你的字符串列名, '.*\\(([^,]+),', 1)
- 正则逻辑说明:
.*贪婪匹配所有字符直到最后一个(,([^,]+)捕获后续到第一个逗号为止的内容,也就是你需要的contentname - 注意Redshift中反斜杠需要二次转义,因此写为
\\(
方案2:兼容性更强的分步提取
如果最内层括号内的格式可能发生变化,可以先提取整个最内层括号的内容,再拆分取第一个值:
SPLIT_PART(REGEXP_EXTRACT(你的字符串列名, '\\(([^()]*)\\)', 1), ',', 1)
- 正则
\(([^()]*)\)会匹配内容中不含其他括号的最内层括号对,捕获括号内的全部内容contentname,None,再用SPLIT_PART按逗号切分取第一个值即可。
验证效果
针对示例字符串CompletenessConstraint(Completeness(contentname,None)),两种方案最终返回结果均为contentname,符合预期。
内容的提问来源于stack exchange,提问作者Itty Bit
相关产品推荐
相关产品推荐

