如何在Redshift中使用正则表达式提取指定内容前的文本
Redshift中提取开头公司名的解决方案
由于Redshift的POSIX正则引擎不支持非捕获组(?:),我们可以通过修改正则表达式,使用普通捕获组或直接替换冗余内容的方式实现需求。
方法一:使用REGEXP_REPLACE替换冗余内容
直接匹配字符串中公司名之后的后缀部分(如Gift Card、Digital Gift Card等),将其替换为空字符串,即可得到开头的公司名:
SELECT card_text, -- 替换掉公司名后的所有冗余内容 REGEXP_REPLACE(card_text, '\s+(Digital\s+)?Gift\s+Cards?.*', '') AS company_name FROM your_table_name;
匹配逻辑说明:
\s+:匹配公司名后至少一个空格(Digital\s+)?:可选的Digital及后续空格(用普通捕获组替代原非捕获组,不影响替换效果)Gift\s+Cards?:匹配Gift Card或Gift Cards.*:匹配后续所有内容
方法二:使用REGEXP_SUBSTR提取捕获组
通过正则捕获组锁定开头的公司名,再指定提取第一个捕获组的内容:
SELECT card_text, -- 提取第一个捕获组的内容(即公司名) REGEXP_SUBSTR(card_text, '^(.*?)\s+(Digital\s+)?Gift\s+Cards?.*', 1, 1, 'e', 1) AS company_name FROM your_table_name;
参数说明:
- 第6个参数
1:指定提取第一个捕获组的内容 'e':启用扩展正则模式,确保捕获组正常工作
验证示例
针对你提供的测试文本,两种方法都能得到预期结果:
| Text | company_name |
|---|---|
| Company-1 Gift Card $100 | Company-1 |
| Company 2 Digital Gift Card $100 | Company 2 |
| Company 6 Gift Card $100 - Physical | Company 6 |
内容的提问来源于stack exchange,提问作者mah65
相关产品推荐
相关产品推荐

