2017-06-18 70 views
3

我有这样一段代码:正则表达式点和逗号问题

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

而这正则表达式:

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

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

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

回答

2

您错误地使用了。它期望一个正则表达式 - 一个/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) 
+0

'它扩展到+, - 。/'......这是一只兔子。你可以评论角色类中逗号和点的最终结果吗?在我看来,他们被允许,因为某些类型的数字可能有逗号和小数点。但我无法证明这一点。 –

+0

@TimBiegeleisen打开字符映射表,你会发现在'+'和'/'之间可以找到符号''''''和'.'。没有什么神秘的,它只是ASCII;) –

+0

所以巧合地是点和逗号被拉进来。这对某个人来说是一个很好的面试问题。 –

2

可以传递search字符串作为你这样做,但在你的正则表达式的-工作的范围(转义字符串文字的解决,所以他们为正则表达式没有区别):

[^0-9*+-/] 

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

[^0-9*+/-] 

或者,你应该(正则表达式一次字符串文字,并再次)翻一番逃避连字符:

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

这是[demo](http://rextester.com/QFWY96398),表明这个答案是正确的。一直以来的问题是两个符号形成了一个意想不到的字符范围。 –