正则表达式在Oracle的同一字符串上返回不同的结果

时间:2019-05-07 10:41:49

标签: regex oracle oracle-sqldeveloper

我正在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 ')
  • 在字符串的第一次出现时,正则表达式会提取“ US-IL”
  • 在字符串的第一次出现时,正则表达式提取“ 13012”

有人知道为什么我会从完全相同的正则表达式中得到不同的结果吗?我试图调试它,以重写正则表达式,但我很困惑。我希望正则表达式针对此字符串的两次出现都返回“ 13012”。

正则表达式必须足够灵活,可以为许多不同的国家/地区提取ZIP和邮政编码,而我的数据集不仅限于美国地址。

1 个答案:

答案 0 :(得分:0)

您应使用REGEXP_SUBSTR提取所需的字符串部分。

示例:

REGEXP_SUBSTR(col, '\s+(\d{5});[0-9];[A-Z]{2};', 1, 1, NULL, 1)

请参见regexOracle demo。正则表达式图:

enter image description here

正则表达式

  • \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