在PostgreSQL中使用正则表达式拆分地址字符串但保留数字

时间:2015-05-22 16:54:41

标签: regex postgresql

我们在Postgresql 9.3中有下一个SQL查询


SELECT 
  regexp_split_to_array('merchant - mall', '(?!^)\s*(?!\d)[\-]\s*(?!\d)\s*(?=.)') as text1,
  regexp_split_to_array('merchant - street 245', '(?!^)\s*(?!\d)[\-]\s*(?!\d)\s*(?=.)') as text2,
  regexp_split_to_array('merchant - street-245', '(?!^)\s*(?!\d)[\-]\s*(?!\d)\s*(?=.)') as text3,
  regexp_split_to_array('merchant - street - 245', '(?!^)\s*(?!\d)[\-]\s*(?!\d)\s*(?=.)') as text4

结果是:

"{merchant,mall}","{merchant,street 245}","{merchant,street-245}","{merchant,street,245}"

问题是第4个样本将数字视为单独的字符串。在postgresql中使用正则表达式有没有办法做到这一点?

使用的正则表达式(在查询中)是:

(?!^)\s*(?!\d)[\-]\s*(?!\d)\s*(?=.)

1 个答案:

答案 0 :(得分:2)

只需在您的否定前瞻声明\s*中添加(?!\d)

(?!^)\s*(?<!\d)[\-]\s*(?!\s*\d)\s*(?=.)
          ^              ^^

或者您可以使用以下简化的正则表达式:

(?<!\d)\b[ -]+\b(?!\d)

请参阅DEMO