使用正则表达式完美匹配ip地址

  笔者最近在学习解释器设计模式的时候注意到了正则表达式的相关内容,突然想起之前一直都有的一个疑问。如何使用正则表达式匹配出一个正确的ip地址。

  一个正确的ip地址是由几个小于255的数字组成的,考虑如何匹配出一个正确的小于255的数字,我们可以划分为个位十位百位,针对不同的情况来匹配。

    注意到有以下几种情况:

      1. 百位和十位为空,这时候个位必定包含一个数所以这里的表示可以是 0{0,2}[0-9]

      2. 百位为空,十位个位包含数据,使用正则表达式可以是0?[0-9]{2},结合1和2两步我们可以使用这样的正则表达式0?[0,9]{1,2}

      3. 百位为1,这种情况应该使用的正则表达式为1[0-9]{2},结合1,2,3步我们可以使用这样的正则表达式[01]?[0-9]{1,2}

      4. 百位为2,这种情况下十位分两种情况,0-4时,个位可以为0-9;当十位为5时,个位只能是0-5. 如此我们得到下面的正则表达式2[0-4][0-9] 和 25[0-5]两种情况

    结合1,2,3,4 中情况得到一个获取小于255的数的正则表达式[01]?[0-9]{1,2}|2[0-4][0-9]|25[0-5]

  接下来看看ip,ip是由4个小于255的整数来表示的。为了方便阅读我们使用一个特殊符号来表示小于255整数的正则表达式,姑且用€表示。

  则ip可以表示为€.€.€.€,简化一下可以表示成(€\.){3}€。这时我们带入小于255的正则表达式,则结果表示为(([01]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])\.){3}([01]?[0-9]{1,2}|2[0-4][0-9]|25[0-5]) 引入单词匹配“\<” 和 "\>",最终结果为\<(([01]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])\.){3}([01]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])\>。这样就能匹配出正确的IP了。

posted @ 2017-03-08 16:41  远行的猴子  阅读(881)  评论(0编辑  收藏  举报