【问题标题】:regexp_replace stringregexp_replace 字符串
【发布时间】:2016-06-07 03:19:08
【问题描述】:

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

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

  • 115 1/2 East 6th St -> 115 1/2 E 6th St
  • 818 东街 -> 818 东街

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

对于我的查询,我已经尝试过

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

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

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

【问题讨论】:

    标签: sql oracle regexp-replace


    【解决方案1】:

    您当前的模式与文字文本 East 后跟任何不是空格的单个字符、St 匹配。我假设您可能打算使用负前瞻来确保“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
    

    【讨论】:

      【解决方案2】:

      这使用 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.
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-07-09
        • 2017-01-11
        • 2018-07-20
        • 2021-12-29
        • 2012-09-25
        • 2020-03-26
        • 1970-01-01
        • 2023-01-19
        相关资源
        最近更新 更多