1

我正在使用 regexp_replace 来标准化邮寄地址,但遇到了我遇到问题的情况。

考虑以下两个地址以及它们的结果应该是什么:

  • 115 1/2 东 6 街 -> 115 1/2 东 6 街
  • 东街 818 号 -> 东街 818 号

在第二个地址中,“东”是街道的实际名称,而不是方向指示符。

对于我的查询,我尝试过

SELECT
     regexp_replace(address, 'East[^ St]', 'E ')

但这无法将第一个地址转换为正确的格式。

如何编写我的 regexp_replace 以便单词 East 在第一个地址中转换为“E”,但在第二个地址中保留单词原样?

4

2 回答 2

2

您当前的模式匹配文字文本East,后跟任何不是空格S、 或的单个字符t。我假设您可能打算使用负前瞻来确保“East”不会出现在“St”之前,但遗憾的是 Oracle 不支持负前瞻。相反,您需要使 REGEXP_REPLACE 有条件:

CASE
    WHEN address LIKE '%East%' AND address NOT LIKE '%East St%'
        THEN REGEXP_REPLACE(address, your_pattern, your_replacement)
    ELSE address
END
于 2016-02-24T17:36:57.230 回答
1

这用 REGEXP_REPLACE() 回答了您的问题。它查找字符串' EAST'(不想捕捉到“east”是另一个单词结尾的情况),后跟一个空格、一个或多个字符、另一个空格和'St'一组记住的字符串。如果找到,将其替换为' E'后跟第二个记住的组(空格后跟一个或多个字符,后跟空格和'St'。这是需要的,因为正则表达式引擎在分析字符串时从左到右“消耗”它们所以你需要把它们放回去注意我添加了一堆不同的测试格式(也总是测试意外!):

SQL> with tbl(address) as (
     select '115 1/2 East 6th St'       from dual union
     select '115 1/2 NorthEast 6th St'  from dual union
     select '115 1/2 East 146th St'     from dual union
     select '115 1/2 East North 1st St' from dual union
     select '818 East Ave'              from dual union
     select '818 Woodward'              from dual union
     select '818 East St'               from dual
   )
   select regexp_replace(address, '( East)( .+ St)', ' E\2') new_addr
   from tbl;

NEW_ADDR
------------------------------------------------------------------------
115 1/2 E 146th St
115 1/2 E 6th St
115 1/2 E North 1st St
115 1/2 NorthEast 6th St
818 East Ave
818 East St
818 Woodward

7 rows selected.
于 2016-02-24T22:51:09.937 回答