【发布时间】:2016-03-29 05:49:59
【问题描述】:
我正在尝试验证 javascript 中的表单字段(使用 bootstrap/jquery),但我需要一个正则表达式来匹配一个字符串,该字符串是一个逗号分隔的数字列表,可能有也可能没有空格。
示例: 1,2,3,3.14,6.0, -3.14, -6, 7.13,100
如果它们都是整数并且中间没有空格,我可以得到正则表达式,但是使用小数确实会使事情复杂化。
【问题讨论】:
标签: javascript regex
我正在尝试验证 javascript 中的表单字段(使用 bootstrap/jquery),但我需要一个正则表达式来匹配一个字符串,该字符串是一个逗号分隔的数字列表,可能有也可能没有空格。
示例: 1,2,3,3.14,6.0, -3.14, -6, 7.13,100
如果它们都是整数并且中间没有空格,我可以得到正则表达式,但是使用小数确实会使事情复杂化。
【问题讨论】:
标签: javascript regex
你可以试试这个:
^(\s*-?\d+(\.\d+)?)(\s*,\s*-?\d+(\.\d+)?)*$
document.write(
/^(\s*-?\d+(\.\d+)?)(\s*,\s*-?\d+(\.\d+)?)*$/.test(
'1,2,3,3.14,6.0, -3.14, -6, 7.13,100'
)
);
如果你分解上面的正则表达式,你会注意到它正在捕获字符串中的第一个数字:
(\s*-?\d+(\.\d+)?)
为了捕获第一个数字,它会根据需要尝试匹配尽可能多的连续空格 \s*,后跟可选的连字符(或负号)-?,后跟至少一个数字 \d+,然后是可选小数点,小数点(\.\d+)? 后至少有一个连续数字。
下一组捕获第一组之后的所有数字。
(\s*,\s*-?(\d+(\.\d+)?)*
与前一个组相同,只是前面有一个额外的\s*,,在匹配逗号, 之前允许有尽可能多的空格\s*。该组根据需要重复多次*。
正则表达式以^ 开头并以$ 结尾,以确保它从字符串^ 的开头开始匹配到字符串$ 的结尾。
【讨论】:
(\d+\.\d+)|\d+ 减少到\d+(?:\.\d+)?
如果正则表达式不是强制性的,那么试试这个简单的逻辑
function isValidInput(str)
{
return str.split(",").filter(function(val){ return isNaN(val) }).length == 0;
}
isValidInput("1,2,3,3.14,6.0, -3.14, -6, 7.13,100");
【讨论】:
替代@gurvinder372 的答案,您可以使用Array.every 而不是Array.filter。好处,它不会循环到最后,并且会在第一个无效条目时中断。但是,如果您希望得到所有不正确的值,那么@gurvinder372 的答案是首选。
function isValidInput(str) {
return str.split(",").every(function(val) {
return !isNaN(val);
})
}
var test = isValidInput("1,2,3,3.14,6.0, -3.14, -6, 7.13,100");
alert(test);
【讨论】:
你可以试试这个
^(\s*(-|\+)?\d+(?:\.\d+)?\s*,\s*)+(-|\+)?\d+(?:\.\d+)?\s*$
正则表达式分解
^ ---> Starting of string
(\s* ---> Match any number of white spaces
(-|\+)? ---> Match - or + sign (optional)
\d+ ---> Match digits before decimal
(?:\.\d+)? ---> Non capturing group to match digits after decimal(optional)
\s*,\s* ---> Match any number of spaces before and after comma
)+ ---> Do this till last comma (or second last number)
(-|\+)?\d+(?:\.\d+)? ---> Same as above but for checking only the last number as it should not have comma
\s* ---> Check spaces after last number
$ ---> End of string
【讨论】: