繁体   English   中英

我需要 oracle 正则表达式将第 2 到第 4 个 position 个字符替换为符号

[英]I need oracle regex to replace 2nd to 4th position characters to symbol

我有像94335251812这样的号码,我想将第 2 到第 4 号 position 替换为符号。

例如

94335251812 -> 9___5251812
123456789 -> 1___56789

您希望将第二到第四个字符替换为下划线 ( _ )。

点( . ) 表示任何字符。 这意味着您可以使用点 map 任何值。 这就像数据库概念中的完全外部连接。 你可以加入任何角色。

例如,以下会将前 3 个字符替换为“xxx”。

select regexp_replace('1@#45', '...', 'xxx') from dual; -- 'xxx45'

您可以将量词重复为{number}

select regexp_replace('1@#45', '.{3}', 'xxx') from dual; -- 'xxx45'

但是你只需要找到第 2 到第 4 个字符。 所以你可以使用第 4 个参数,它是起始索引。

select regexp_replace('1@#45', '.{3}', 'xxx', 2) from dual; -- '1xxx5'

这很简单,但对我来说并不容易,因为我使用的所有编辑器都不支持替换起始索引。 (记事本++、VSCode、Visual Studio...)

所以我通过重复点( . )找到所有字符。

-- .: 1st characther
-- .{3}: 2nd to 4th characters
-- .+: all characters to end of string
select regexp_replace('1@#45', '..{3}.+', 'xxx') from dual; -- 'xxx'

结果是错误的,因为我替换了整个字符串,所以我需要恢复原始值。

您可以使用组标记您的搜索作为(pattern1)(pattern2)以在替换中引用。 您可以按索引将组引用为\1\2

以下结果相同,因为所有组都已恢复。

select regexp_replace('1@#45', '(.)(.{3})(.+)', '\1\2\3') from dual; -- 1@#45

现在您用点 ( . ) 映射了所有字符,并将要恢复的内容和要替换的内容划分为组。 您只需要将第二组替换为 3 _

select regexp_replace('1@#45', '(.)(.{3})(.+)', '\1___\3') from dual; -- 1___5

https://dbfiddle.uk/?rdbms=oracle_11.2&fiddle=de84fbd3ff667a010b03958c52b849c6

暂无
暂无

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

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