我有这段代码:
if(calcValue.search('[^0-9\*\+\-\/]') > -1) {
jQuery('.output-field').text('Error: you can use only numbers and "+", "*", "-", "/" symbols');
}
这个正则表达式:
[^0-9\*\+\-\/]
必须排除所有符号,除了0-9位和符号:+, - ,*和/但不知何故它不排除点和逗号。如何排除点和逗号?
您还可以检查代码here:如果您输入除数字,允许的符号以及未知原因点和逗号之外的任何内容,则会出现错误消息。
答案 0 :(得分:2)
您错误地使用了String.prototype.search
。它需要一个正则表达式 - 一个/regex literal/
或一个new RegExp
对象 - 但是你给它一个字符串。
根据documentation,传递的非正则表达式使用new RegExp(arg)
隐式转换为一个。
您正在传入字符串文字'[^0-9\*\+\-\/]'
,它将成为字符串[^0-9*+-/]
。然后将其隐式传递为new RegExp('[^0-9*+-/]')
,结果字符类包括+-/
,其扩展为+,-./
,这是逗号和点所在的位置。
我在这里有两条建议。
第一个也是最明显的是始终传递预期的数据类型。在这种情况下,正则表达式。
第二是对你的逃避更加谨慎。它们在最好的时候可能很挑剔并且有许多陷阱要避免 - 特别是当解析发生两次时(一次用于字符串,一次用于正则表达式)。量词不需要在角色类中进行转义,/
分隔符不需要转义,除非您使用/regex literal/
。此外,如果-
范围是字符类中的第一个或最后一个字符,则不需要转义。
因此,我建议的解决方案是:
if( calcValue.search(new RegExp('[^0-9/*+-]')) > -1)
答案 1 :(得分:2)
你可以像你一样传递search
一个字符串,但正则表达式中的-
作为一个范围(转义在字符串文字中解析,所以它们对于常规字符串没有区别表达式):
[^0-9*+-/]
因此,您的课程禁止0
至9
,*
,+
至/
,最后一个范围包括点和逗号(以及连字符)。所以你应该将连字符移到最后一个位置:
[^0-9*+/-]
或者,你应该双重转义连字符(一次用于字符串文字,再一次用于正则表达式):
'[^0-9*+\\-/]'