正则表达式格式化IPv6地址 - 删除前导零

问题描述 投票:0回答:4

假设我有一个类似的IPv6地址:

2001:04E8:0000:4001:0000:0000:0000:0000/64

我希望输出像

2001:4E8:0:4001:0:0:0:0/64

所以基本上,它会删除前导零,同时用一个零替换四个零。

replaceAll("(:(0)*)|(^0+)",":")

上面的正则表达式完成了这项工作,但是输出为

2001:4E8::4001::::/64

全部省略了四个零。

注意:输入可能是任何有效的ipv6地址

sql regex oracle
4个回答
2
投票

您可以使用REPLACE两次和SUBSTR删除前导0。

SELECT ipv6,
       SUBSTR(REPLACE(REPLACE(':' || ipv6, ':00', ':'),':0', ':'),2) AS result
FROM tab;

SqlFiddleDemo

演示使用MySQL因为Oracle没有响应。唯一的变化是字符串连接。

输出:

╔═════════════════════════════════════════════╦════════════════════════════╗
║                    ipv6                     ║           result           ║
╠═════════════════════════════════════════════╬════════════════════════════╣
║ 2001:04E8:0000:4001:0000:0000:0000:0000/64  ║ 2001:4E8:0:4001:0:0:0:0/64 ║
║ 0000:0001:0012:0123:1234:0000:0000:0000/64  ║ 0:1:12:123:1234:0:0:0/64   ║
║ 0001:04E8:0000:4001:0000:0000:0000:0000/64  ║ 1:4E8:0:4001:0:0:0:0/64    ║
║ 0012:04E8:0000:4001:0000:0000:0000:0000/64  ║ 12:4E8:0:4001:0:0:0:0/64   ║
║ 0123:04E8:0000:4001:0000:0000:0000:0000/64  ║ 123:4E8:0:4001:0:0:0:0/64  ║
╚═════════════════════════════════════════════╩════════════════════════════╝

1
投票

使用Oracle Regexp_Replace的示例:

   SQL> with t as (
  2  select '2001:04E8:0000:4001:0000:0000:0000:0000/64' str from dual union all
  3  select '0000:0001:0012:0123:1234:0000:0000:0000/64' from dual union all
  4  select '0001:04E8:0000:4001:0000:0000:0000:0000/64' from dual union all
  5  select '0000:0001:0012:0123:1234:0000:0000:0000/64' from dual
  6  ) -- end of sample data
  7  select regexp_replace(str, '(:|^)(0{0,3})([1-9]*)', '\1\3') str
  8    from t;
STR
--------------------------------------------------------------------------------
2001:4E8:0:4001:0:0:0:0/64
0:1:12:123:1234:0:0:0/64
1:4E8:0:4001:0:0:0:0/64
0:1:12:123:1234:0:0:0/64

0
投票

在java中,这样的东西有效:

replaceAll("(:000)|(:0*)", ":");

0
投票

试试这个:

WITH t AS (
  SELECT '2001:04E8:0000:4001:0000:0000:0000:0000/64' str FROM dual UNION ALL
  SELECT '0000:0001:0012:0123:1234:0000:0000:0000/64' FROM dual UNION ALL
  SELECT '0001:04E8:0000:4001:0000:0000:0000:0000/64' FROM dual UNION ALL
  SELECT '0000:0001:0012:0123:1234:0000:0000:0000/64' FROM dual UNION ALL
  SELECT '2001:04E8:0000:4001:0000:0:0000:0/64' FROM dual
  )
SELECT 
    REGEXP_REPLACE(str, '(:|^)0+([[:xdigit:]]+)', '\1\2')
from t;

2001:4E8:0:4001:0:0:0:0/64
0:1:12:123:1234:0:0:0/64
1:4E8:0:4001:0:0:0:0/64
0:1:12:123:1234:0:0:0/64
2001:4E8:0:4001:0:0:0:0/64
© www.soinside.com 2019 - 2024. All rights reserved.