繁体   English   中英

regexp_replace字符串

[英]regexp_replace string

我正在使用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',但在第二个地址中保留单词?

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM