AWS Redshift正则表达式提取服务器名:排除末尾附加的root
解决AWS Redshift中提取服务器名的正则问题
需求是从指定字符串中提取服务器名,规则如下:
- 服务器名格式为「字母+数字」或「字母+数字+字母」
- 不能是'root'
- 数据源会在字符串末尾附加'root',示例及预期提取结果:
ab-vol-bapp000123-use-dev→ 提取app000123ab-vol-bapp000123sql-use-dev→ 提取app000123sqlab-vol-bapp000123root-use-dev→ 提取app000123ab-vol-bapp000123sqlroot-use-dev→ 提取app000123sql
之前尝试的正则无法正确排除末尾的'root',原正则如下:
(^ab-vol-) # literal ([a-z]{2,4}) # 2-4 alphas ([0-9]{4,6}) # 4-6 numerics ( (?!root) # ignore 'root' [a-z]{0,4} # 0-4 alphas )?
问题分析
原正则中的(?!root)是正向否定预查,仅检查当前位置后不是'root',但未限制后续字符不能是'root'的一部分,导致无法正确截断末尾的'root'后缀。
正确的正则写法
结合AWS Redshift支持的POSIX扩展正则语法,可使用以下正则:
ab-vol-b([a-z]{2,4}[0-9]{4,6}(?:[a-z]*?(?<!root)))(?=-)
正则解释
ab-vol-b:匹配固定前缀,跳过非目标部分[a-z]{2,4}[0-9]{4,6}:匹配服务器名的「字母+数字」核心结构(?:[a-z]*?(?<!root)):[a-z]*?:非贪婪匹配后续字母,避免过度匹配(?<!root):反向否定预查,确保匹配的字母段结尾不是'root'
(?=-):正向预查,定位到后续连字符位置,实现精准截断
测试验证
对示例字符串的捕获组结果完全符合预期:
ab-vol-bapp000123-use-dev→app000123ab-vol-bapp000123sql-use-dev→app000123sqlab-vol-bapp000123root-use-dev→app000123ab-vol-bapp000123sqlroot-use-dev→app000123sql
Redshift实际使用示例
通过REGEXP_SUBSTR函数提取:
SELECT REGEXP_SUBSTR('ab-vol-bapp000123root-use-dev', 'ab-vol-b([a-z]{2,4}[0-9]{4,6}(?:[a-z]*?(?<!root)))(?=-)', 1, 1, 'e', 1) AS server_name;
参数说明:'e'指定使用扩展正则语法,最后一个1表示提取第一个捕获组的内容。
内容的提问来源于stack exchange,提问作者SimonB
相关产品推荐
相关产品推荐

