正则表达式点和逗号问题

时间:2017-06-18 14:24:39

标签: javascript regex

我有这段代码:

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

这个正则表达式:

[^0-9\*\+\-\/]

必须排除所有符号,除了0-9位和符号:+, - ,*和/但不知何故它不排除点和逗号。如何排除点和逗号?

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

2 个答案:

答案 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*+-/]

因此,您的课程禁止09*+/,最后一个范围包括点和逗号(以及连字符)。所以你应该将连字符移到最后一个位置:

[^0-9*+/-]

或者,你应该双重转义连字符(一次用于字符串文字,再一次用于正则表达式):

'[^0-9*+\\-/]'