一系列IP的正则表达式?

时间:2014-08-19 18:23:17

标签: javascript design-patterns web

我正在尝试检查输入文本是否类似:

(IP| IP1, IP2 | IP1, IP2, IP3) and so on .....

例如172.25.1.4172.25.1.4, 172.25.1.5
172.25.1.4, 172.25.1.6, 3.3.3.3等等......被接受了。

并且IPS之间的空间也不是强制性的:172.25.1.4,172.25.1.5被接受

我不知道该用什么作为模式:

var pattern = theCorrectPattern

if (!pattern.test(id1) && id1.value!="") {

    document.getElementById("id").innerHTML="<p style='color:red'>not correct</p>";

}

else

{
    document.getElementById("id").innerHTML="<p></p>";

}

1 个答案:

答案 0 :(得分:4)

让我们把它拼凑起来。首先,我们需要一个单个八位字节的正则表达式(IP的四个部分之一)。数字可以从0到255.我们如何使用正则表达式实现这一目标?

对于0-199的情况,我们可以有一个简单的正则表达式,它允许一个可选的0或1,后跟0-9范围内的至少一个但不超过两个数字:

/[01]?[0-9]{1,2}/

现在,我们需要处理200-255案例。这有点复杂;例如,249有效但259不有效。因此,我们有另一种模式需要2,然后是0-4范围内的一位数字,接着是0-9范围内的一位数字。这处理200-249案例:

/2[0-4][0-9]/

最后,我们需要一个模式来处理最终的250-255案例,这应该是相当明显的:

/25[0-5]/

让我们将这些字符串组合成一个我们可用于八位字节的正则表达式:

/([01]?[0-9]{1,2}|2([0-4][0-9]|5[0-5]))/
  ^ 0-199 case    ^ 200s
                     ^ 200-249 ^ 250-255

或许有点笨拙,但它确实有效。让我们把它藏起来用于我们即将推出的模式。

var octetPattern = "([01]?[0-9]{1,2}|2([0-4][0-9]|5[0-5]))";

现在,我们需要一个处理其中四个的模式,用句点分隔。我们这样做是通过匹配一个八位字节,然后匹配3个(句点,八位字节)。

var ipPattern = octetPattern + "(\\." + octetPattern + "){3}";

几乎就在那里。我们的最终模式匹配IP后跟零或更多(逗号,可选空格,IP):

var ipGroupPattern = ipPattern + "(, *" + ipPattern + ")*";

现在我们使用锚字符构造一个RegExp对象。 (如果没有它们,模式将匹配包含 IP组的任何文本;我们希望仅在完整文本匹配时匹配。)

var pattern = new RegExp("^" + ipGroupPattern + "$");

所有这一切都导致了这个可爱的混乱:

/^([01]?[0-9]{1,2}|2([0-4][0-9]|5[0-5]))(\.([01]?[0-9]{1,2}|2([0-4][0-9]|5[0-5]))){3}(, *([01]?[0-9]{1,2}|2([0-4][0-9]|5[0-5]))(\.([01]?[0-9]{1,2}|2([0-4][0-9]|5[0-5]))){3})*$/

See it run。)