Javascript 正则表达式点和逗号问题

Javascript 正则表达式点和逗号问题,javascript,regex,Javascript,Regex,我有一段代码: if(calcValue.search('[^0-9\*\+\-\/]') > -1) { jQuery('.output-field').text('Error: you can use only numbers and "+", "*", "-", "/" symbols'); } 这个正则表达式: [^0-9\*\+\-\/] [^0-9*+-/] '[^0-9*+\\-/]' 必须排除所有符号,0-9位和符号除外:+、-、*和/但不知何故,它不排

我有一段代码:

if(calcValue.search('[^0-9\*\+\-\/]') > -1) {
    jQuery('.output-field').text('Error: you can use only numbers and "+", "*", "-", "/" symbols');
  }
这个正则表达式:

[^0-9\*\+\-\/]
[^0-9*+-/]
'[^0-9*+\\-/]'
必须排除所有符号,0-9位和符号除外:+、-、*和/但不知何故,它不排除点和逗号。如何排除点和逗号呢


您还可以检查代码:如果您在输入中输入了除数字、允许的符号以及未知原因的点和逗号以外的任何内容,则会出现错误消息。

您使用的是
String.prototype.search
。它需要一个正则表达式-一个
/regex literal/
或一个
新的RegExp
对象-但您给它一个字符串

根据,传递的非正则表达式使用
newregexp(arg)
隐式转换为一个

您正在传入字符串literal
“[^0-9\*\+-\/]”
,它将成为字符串
[^0-9*+-/]
。然后将其隐式传递为
new RegExp(“[^0-9*+-/]”)
,生成的字符类包括
+-/
,该类扩展为
+,-./
,其中允许逗号和点

我这里有两条建议

第一个,也是最明显的一个,是始终传递预期的数据类型。在本例中,使用正则表达式

第二是在逃跑时要更加谨慎。在最好的情况下,它们可能会很挑剔,并且有许多陷阱需要避免——特别是当解析发生两次时(一次用于字符串,一次用于正则表达式)。量词不需要在字符类中转义,
/
分隔符不需要转义,除非您使用的是
/regex literal/
。此外,如果
-
范围是character类中的第一个或最后一个字符,则它不需要转义

因此,我建议的解决方案是:

if( calcValue.search(new RegExp('[^0-9/*+-]')) > -1)

您可以像传递字符串一样传递
search
,但正则表达式中的
-
作为一个范围(转义在字符串文本中解析,因此它们对正则表达式没有影响):

因此,您的类禁止
0
9
*
+
/
,最后一个范围包括点和逗号(以及连字符)。因此,应将连字符移动到最后一个位置:

[^0-9*+/-]
或者,应该双转义连字符(一次转义字符串文字,另一次转义正则表达式):


扩展为+,-。/
。。。这有点像兔子。你能评论一下逗号和点是如何在字符类中结束的吗?在我看来,它们被允许是因为某些类型的数字可能有逗号和小数点。但是我不能证明这一点。@TimBiegeleisen打开字符映射,你会看到,在
+
/
之间,可以找到符号
-和
。它没有什么神秘之处,只是ASCII;)所以巧合的是,只有点和逗号被拉进来了。这对某人来说是一个很好的面试问题。@TimBiegeleisen也许,但前提是谷歌被允许。我不希望任何人都知道这一点。这表明这个答案是正确的。问题一直是其中两个符号形成了一个意外的字符范围。