regexp_replace 字符串
regexp_replace string
我正在使用 regexp_replace 来标准化邮寄地址,但我遇到了一个问题。
考虑以下两个地址及其结果应该是什么:
- 115 1/2 东六街 -> 115 1/2 东六街
- 818 东街 -> 818 东街
在第二个地址中,"East"是街道的实际名称,不是方向指示器。
对于我的查询,我尝试了
SELECT
regexp_replace(address, 'East[^ St]', 'E ')
但这无法将第一个地址转换为正确的格式。
如何编写 regexp_replace 以便在第一个地址中将单词 East 转换为 'E',但在第二个地址中保留该单词?
您当前的模式匹配文字文本 East
后跟任何非 space、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
这用 REGEXP_REPLACE() 回答了你的问题。它查找字符串 ' EAST'
(不想捕捉 'east' 是另一个单词结尾的情况)后跟一个 space,一个或多个字符,另一个 space 和字符串 'St'
在一组中被记住。如果找到,将其替换为 ' E'
后跟第二个记住的组(space 后跟一个或多个字符后跟 space 和 'St'
。这是必需的,因为它们是 'consumed' 正则表达式引擎,因为它从左到右移动分析字符串,所以你需要把它们放回去。注意我添加了一堆不同的测试格式(也总是测试意外!):
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') 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.
我正在使用 regexp_replace 来标准化邮寄地址,但我遇到了一个问题。
考虑以下两个地址及其结果应该是什么:
- 115 1/2 东六街 -> 115 1/2 东六街
- 818 东街 -> 818 东街
在第二个地址中,"East"是街道的实际名称,不是方向指示器。
对于我的查询,我尝试了
SELECT
regexp_replace(address, 'East[^ St]', 'E ')
但这无法将第一个地址转换为正确的格式。
如何编写 regexp_replace 以便在第一个地址中将单词 East 转换为 'E',但在第二个地址中保留该单词?
您当前的模式匹配文字文本 East
后跟任何非 space、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
这用 REGEXP_REPLACE() 回答了你的问题。它查找字符串 ' EAST'
(不想捕捉 'east' 是另一个单词结尾的情况)后跟一个 space,一个或多个字符,另一个 space 和字符串 'St'
在一组中被记住。如果找到,将其替换为 ' E'
后跟第二个记住的组(space 后跟一个或多个字符后跟 space 和 'St'
。这是必需的,因为它们是 'consumed' 正则表达式引擎,因为它从左到右移动分析字符串,所以你需要把它们放回去。注意我添加了一堆不同的测试格式(也总是测试意外!):
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') 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.