我正在Oracle中使用REGEXP_REPLACE从字符串列表中提取邮政编码。当我在字符串上测试正则表达式时,邮政编码已正确提取。但是,当我在Oracle中的VIEW上将正则表达式移至生产环境时,我从正则表达式中得到的结果却完全相同。
以下字符串在我的VIEW中出现了两次:
;2;5;1;1;Company Name;1;Location;1;12 Street;1;City, US-IL 13012;1;US;
我正在VIEW中使用以下语句捕获邮政编码
REGEXP_REPLACE (tb."ADDRESS", '.*([A-Z]{2}[0-9]?-[A-Z0-9]* ?|, ?)([^;]{0,10}|);[0-9];[A-Z]{2};', '\2 ')
有人知道为什么我会从完全相同的正则表达式中得到不同的结果吗?我试图调试它,以重写正则表达式,但我很困惑。我希望正则表达式针对此字符串的两次出现都返回“ 13012”。
正则表达式必须足够灵活,可以为许多不同的国家/地区提取ZIP和邮政编码,而我的数据集不仅限于美国地址。
答案 0 :(得分:0)
您应使用REGEXP_SUBSTR
提取所需的字符串部分。
示例:
REGEXP_SUBSTR(col, '\s+(\d{5});[0-9];[A-Z]{2};', 1, 1, NULL, 1)
请参见regex和Oracle demo。正则表达式图:
正则表达式
\s+
-超过1个空格(\d{5})
-第1组(结果)”五位数;[0-9];[A-Z]{2};
-;
,一个数字,;
,两个大写字母,;
。如果您打算坚持使用特定的正则表达式,请注意,实际值在组2中。因此,您需要指定2
作为REGEXP_SUBSTR
的最后一个参数:
REGEXP_SUBSTR(col,
'.*([A-Z]{2}[0-9]?-[A-Z0-9]* ?|, ?)([^;]{0,10}|);[0-9];[A-Z]{2};',
1, 1, NULL, 2)
请参见this Oracle demo。