我正在尝试检查输入文本是否类似:
(IP| IP1, IP2 | IP1, IP2, IP3) and so on .....
例如172.25.1.4
或172.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>";
}
答案 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。)