【发布时间】:2014-03-05 02:18:40
【问题描述】:
请在标记为重复之前阅读
我无法创建或找到适用于所有 IPv6 格式的 RegEx(我的测试用例如下)。我知道每个人都指向的这个问题:Regular expression that matches valid IPv6 addresses 但是,它们都将 IPv6 与 IPv4 结合起来和/或不适用于我的所有测试用例。
要求:
- 我不希望它也验证 IPv4 值,我已经有一个单独的 IPv4 验证函数。
- 我需要一个适用于
Coldfusion的模式和一个适用于PL/SQL的模式。 - 因为我在
PL/SQL中使用它,所以它的模式必须保持在512 个字符以下。而Oracle 只支持RegExp 语言的一小部分。因此,ColdFusion模式最终可能与PL/SQL模式不同,这很好,只要它们都有效。 - 最终结果不是一个很长的正则表达式,可以拆分。
这是我正在尝试的最新模式:
^(?>(?>([a-f0-9]{1,4})(?>:(?1)){7}|(?!(?:.*[a-f0-9](?>:|$)){8,})((?1)(?>:(?1)){0,6})?::(?2)?)|(?>(?>(?1)(?>:(?1)){5}:|(?!(?:.*[a-f0-9]:){6,})(?3)?::(?>((?1)(?>:(?1)){0,4}):)?)?(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(?>\.(?4)){3}))$
ColdFusion 接近但不是 100%。它在PL/SQL 中根本不起作用。
测试结果http://regex101.com/r/wI8cI0 粗体项是模式在ColdFusion中不起作用的项:
- 匹配
- 匹配
- 匹配
- 匹配
- 匹配
- match(但@Michael Hampton 说这不应该匹配,因为它不是有效的 IPv6 地址,但其他人告诉我它是有效的,所以我不确定这个测试用例。)
- 匹配(
::实际上是一种有效的格式,感谢@Sander Steffann。) - 匹配
- 不匹配
- 匹配
- 不匹配
- 不匹配
- 不匹配
- 匹配
- 匹配
- 不匹配
- 不匹配
- 不匹配
- 不匹配
我从:http://publib.boulder.ibm.com/infocenter/iseries/v5r3/index.jsp?topic=%2Frzai2%2Frzai2ipv6addrformat.htm 获得了测试用例 8-11 并被告知:测试 9 和 11 用于 IPv6 地址前缀,而不是 IPv6 地址,因此不应匹配。
最终结果,我需要他们在这样的语句中工作:
冷融合:
<cfset IndexOfOccurrence1=REFind("^(?>(?>([a-f0-9]{1,4})(?>:(?1)){7}|(?!(?:.*[a-f0-9](?>:|$)){8,})((?1)(?>:(?1)){0,6})?::(?2)?)|(?>(?>(?1)(?>:(?1)){5}:|(?!(?:.*[a-f0-9]:){6,})(?3)?::(?>((?1)(?>:(?1)){0,4}):)?)?(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(?>\.(?4)){3}))$",value[i])>
PL/SQL:
if ( REGEXP_LIKE(v,'^(?>(?>([a-f0-9]{1,4})(?>:(?1)){7}|(?!(?:.*[a-f0-9](?>:|$)){8,})((?1)(?>:(?1)){0,6})?::(?2)?)|(?>(?>(?1)(?>:(?1)){5}:|(?!(?:.*[a-f0-9]:){6,})(?3)?::(?>((?1)(?>:(?1)){0,4}):)?)?(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(?>\.(?4)){3}))$','i') ) then
【问题讨论】:
-
您的第 6 项无效有效。正则表达式是正确的。您的测试用例不是 IPv4 映射的 IPv6 地址的有效示例。修复测试用例。
-
好的。做了更多研究,我认为第 6 项不是您所说的有效格式,但这些是有效格式,但 RegEx 说它们不是:(这两种格式允许 IPv6 应用程序直接与 IPv4 应用程序通信)
0:0:0:0:0:ffff:192.1.56.10&::ffff:192.1.56.10/96(接下来的两种格式用于隧道。它允许 IPv6 节点跨 IPv4 基础设施进行通信)0:0:0:0:0:0:192.1.56.10&::192.1.56.10/96(来自:publib.boulder.ibm.com/infocenter/iseries/v5r3/…) -
您在最终评论中给出的最后两个在几年前曾经有效,但 are no longer in use today。您链接的文档已有十多年的历史...
-
不要使用正则表达式进行 IPv6 解析。这是一场噩梦。
标签: regex oracle coldfusion plsql ipv6