2015-02-11 83 views
1

我有一个带有字段的表单。他们需要输入的格式如下。 10.222.92.160(asxvlc558-ipsn),10.222.92.161(asxvlc559-ipsn),10.222.92.162(asxvlc560-ipsn)检查变量中括号的语法

我不在乎太多的括号之间什么,但我不关心IP格式,其中Parens和逗号分隔。

有人可以提供一段代码。我试图使用RegExp来做到这一点,但无法获得正确的匹配。

这里是表格线

<textarea name="ro_access" onchange='validatehost(this.value)'> 
10.10.10.10(somehost01-ipsn),10.10.10.11(somehost02-ipsn)</textarea></td> 

这是我在JS部分刺。没有太多的JS人,所以不会笑得太多。

function validatehost(value) { 
    var ipRE = new RegExp('\d+\.\d+\.\d+\.\d+\(*\),'); 
     var r = ipRE.test(value); 
if (r >= 0) { 
    alert("Hostnames are not in the Right Format. Use:ip(hostname),"); 
     document.NFSNew.ro_access.focus(); 
     return false; 
} 
    } 
+0

你的'*'是错误的。 – SLaks 2015-02-11 22:39:33

回答

0

这里有一个简单的例子:

function validatehost (value) { 
 
    var ipRE = /^\s*(?:\d+\.\d+\.\d+\.\d+\(.*?\)(?:,(?!\s*$)|\s*$))+$/; 
 
    alert(ipRE.test(value)); 
 
}
<textarea id="text" cols="40"> 
 
10.10.10.10(somehost01-ipsn),10.10.10.11(somehost02-ipsn) 
 
</textarea> 
 
<button onclick="validatehost(document.getElementById('text').value)">Validate</button>

主要错误在那里:

new RegExp('\d+\.\d+\.\d+\.\d+\(*\),'); 

你传递一个字符串RegExp构造,但你的反斜杠丢失:输入"\d"在JS控制台中,您会看到它最终为"d"。你或者不得不加倍反斜杠或者像我那样使用正则表达式。

我也改变了正则表达式。它应该符合你的需求。

+0

注意:它将匹配尾随逗号。只是让你知道。 – hwnd 2015-02-11 23:19:52

+0

@hwnd谢谢,修正。 – 2015-02-11 23:23:11

0

这应该这样做:

function validateHost(hosts) { 
    return /^\s*(?:(?:\d{1,3}\.){3}\d{1,3}\([a-zA-Z0-9-]+\)(?:,\d|$))+\s*$/.test(hosts); 
} 

的主机名部分将接受这个角色a-zA-Z0-9-(全部小写,全大写和所有的数字),如果你不关心你可以把.+?这意味着什么,但至少1个字符。对于ip部分将需要最多3位数字,每个数字最少1个,最多4个数字。这不是傻瓜证明,因为有人可以输入一个高于255的数字,但应该非常稳固。如果你想完美匹配并且不想在字符串周围留下任何空格,请删除\s*

+0

注意:您的正则表达式似乎不匹配。 – hwnd 2015-02-11 23:19:27

+0

它匹配但不允许任何空格在开头https://regex101.com/r/lL4vV2/1,相应地更改。 – ntrp 2015-02-11 23:20:55

1

正则表达式的语法是错误的,通过用*量词对其进行量化,您匹配(“零个或多个”时间。相反,您可以使用.并将其设置为非贪婪匹配。

如果格式可以重复,我会把它放在一个组中并使用锚点。

var ipRE = /^\s*(?:\d+\.){3}\d+\(.*?\)(?:,(?:\d+\.){3}\d+\(.*?\))*\s*$/ 

注:它很容易在这里使用的,而不是一个RegExp对象字面正则表达式。