请在标记为重复之前阅读
我还没有能够创建或找到一个适用于 * 所有 * IPv6格式的RegEx(我的测试案例如下)。我知道每个人都指向这个问题:Regular expression that matches valid IPv6 addresses但是,它们都将IPv6与IPv4结合在一起,并且/或者不适用于我的所有测试用例。
要求:
1.我不想让它也验证IPv4值,我已经有一个单独的IPv4验证函数。
1.我需要一个在Coldfusion
中工作的模式和一个在PL/SQL
中工作的模式。
1.因为我在PL/SQL
中使用它,所以它的模式必须保持在512个字符以下。Oracle只支持RegExp语言的一小部分。所以ColdFusion
模式最终可能与PL/SQL
模式不同,这没关系,只要它们都能工作。
1.最终结果不一定是一个长的RegEx,它可以被拆分。
下面是我正在尝试的最新模式:
^(?>(?>([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****bold项是模式在ColdFusion
中不起作用的项:
1.相匹配
1.相匹配
1.相匹配
1.相匹配
1.相匹配
1.match(但是@Michael汉普顿说这不应该匹配,因为它不是有效的IPv6地址,但是其他人告诉我它是有效的,所以我不确定这个测试用例。)
1.匹配(::
实际上是一个有效格式,谢谢@Sander Steffann。)
1.相匹配
1.无匹配项
1.相匹配
1.无匹配项
1.无匹配项
1.无匹配项
1.相匹配
1.相匹配
1.无匹配项
1.无匹配项
1.无匹配项
1.无匹配项
测试用例8-11来自:http://publib.boulder.ibm.com/infocenter/iseries/v5r3/index.jsp?topic=%2Frzai2%2Frzai2ipv6addrformat.htm有人告诉我:测试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
4条答案
按热度按时间aiazj4mn1#
在@nhahtdh的帮助下,我发现把它分解是最好的解决方案。下面是一个在
PL/SQL
中如何做的例子,但在其他语言中也可以这样做。我将在ColdFusion
中做同样的事情。对于PL/SQL
,模式需要保持在512个字符以下,所以分解它效果很好,而且很容易理解。它通过了我在最初问题中的所有测试案例。5fjcxozz2#
据我所知,没有一个RegEx可以适用于所有的IPv6格式。即使有,它也是如此复杂,难以维护(不易读取)。此外,它还可能导致性能问题。因此,我决定为此编写一个方法(函数)。您也可以根据需要轻松添加任何特殊情况。我用C#编写了它,但我认为您可以将此算法转换为任何语言:
我还添加了其他方法,如如何在文本或文件中搜索IPv6。您可以检查:与有效IPv6地址匹配的正则表达式
编辑摘要:已涵盖Ipv4Map字符和特殊字符,如“::123.23.23.23“、“fe80::3%eth0”、“::ffff:192.1.56.10/96“。
368yc8dk3#
::
是有效的IPv6地址(全零地址),为什么不接受它呢?如果你不想接受最后32位用IPv4表示法写的IPv6地址(为什么不呢,它们是有效的地址表示法),那么只需撤销处理它们的正则表达式的最后一部分(从
::(ffff
开始)。无论如何,正则表达式确实在IPv4表示法部分包含一些错误。IPv4表示法只是写入IPv6地址最后32位的一种不同方式,正则表达式并不处理所有有效的变体。此外,它甚至忘记转义
.
,因此它也将接受许多无效字符串。mspsb9vt4#
这是一个综合性的IPv6正则表达式,用于测试所有有效的IPv6文本表示法(expanded、compressed、expanded-mixed、compressed-mixed)以及可选的前缀长度。它还将各个部分捕获到捕获组中。通过在捕获组的左括号后面放置
?:
,可以跳过捕获组。这是我在IPvX IP calculator中为IPv4和IPv6创建并使用的正则表达式。
附加IPv4正则表达式: