使用正则表达式匹配第一个地址

时间:2019-04-01 08:35:03

标签: sql regex oracle

我有相当脏的客户地址数据。对于每个客户端,一个字符串中有2个或更多地址。我想在Oracle中使用正则表达式减去第一个。

如果分隔符与';'相同,将非常容易。但是有时会出现逗号。地址中也使用逗号分隔城市,街道和建筑物。

我有俄语地址,所以我为您翻译了它们。

例如,我有一个包含多个地址的字符串:

enter image description here

逗号是分隔符,但它也分隔地址内的块。
因此,我可以通过匹配所有内容直到第二个'\sul\.'来匹配第一个地址。

但是我不怎么做。 Regexp_substr(address, '.*,\sul')将返回

enter image description here

这远远超出了我的需要。

那么我怎么减去所有东西,直到第二,\sul\.

Russia, Moscow, ul. Tverskaya, d.32应该返回。

1 个答案:

答案 0 :(得分:1)

您可以使用SUBSTRINSTR而不是正则表达式满足此要求。下面的表达式应该可以满足您的需求:

SUBSTR(v, 1, INSTR(v, ', ul.', 1, 2) - 1)

INSTR()查找源字符串中字符串', ul.'第二次出现的位置,SUBSTR()选择从字符串开头到该位置(负1)的所有内容。 / p>

示例:

WITH t AS (
    SELECT 'Russia, Moscow, ul. Tverskaya, d.32, ul. Yakimanka, d21, ul. Kalinina, d.43' address FROM DUAL
)
SELECT SUBSTR(address, 1, INSTR(address, ', ul.', 1, 2) - 1) adress1 FROM t
| ADRESS1                             |
| :---------------------------------- |
| Russia, Moscow, ul. Tverskaya, d.32 |

Demo on DB Fiddle


NB:只要在字符串中确实存在至少两次给定模式,此方法就起作用。如果碰巧具有与该规范不匹配的值并且要保留,则需要进行其他级别的测试,例如:

CASE INSTR(address, ', ul.', 1, 2)
    WHEN 0 THEN address
    ELSE SUBSTR(address, 1, INSTR(address, ', ul.', 1, 2) - 1) 
END adress1 

Demo on DB Fiddle