[英]Regular Expression dot and comma issue
我有这段代码:
if(calcValue.search('[^0-9\*\+\-\/]') > -1) {
jQuery('.output-field').text('Error: you can use only numbers and "+", "*", "-", "/" symbols');
}
而这个正则表达式:
[^0-9\*\+\-\/]
必须排除所有符号,除了0-9位和符号:+, - ,*和/但不知何故它不排除点和逗号。 如何排除点和逗号呢?
您还可以在此检查代码:如果您输入除数字,允许的符号以及未知原因点和逗号之外的任何内容,将会出现错误消息。
您正在错误地使用String.prototype.search
。 它期望一个正则表达式 - 一个/regex literal/
或一个new RegExp
对象 - 但你给它一个字符串。
根据文档 ,传递的非正则表达式使用new RegExp(arg)
隐式转换为一个。
您正在传入字符串文字'[^0-9\\*\\+\\-\\/]'
,它将成为字符串[^0-9*+-/]
。 然后将其作为new RegExp('[^0-9*+-/]')
隐式传递,结果字符类包括+-/
,它扩展为+,-./
。/这是逗号和点的允许位置在。
我在这里有两条建议。
第一个也是最明显的是始终传递预期的数据类型。 在这种情况下,正则表达式。
第二是对你的逃避更加谨慎。 它们在最好的时候可能很挑剔并且有许多陷阱要避免 - 特别是当解析发生两次时(一次用于字符串,一次用于正则表达式)。 量词不需要在字符类中进行转义,并且/
delimiter不需要转义,除非你使用/regex literal/
。 此外,如果它是字符类中的第一个或最后一个字符,则-
range范围不需要转义。
因此,我提出的修复方案是:
if( calcValue.search(new RegExp('[^0-9/*+-]')) > -1)
您可以像往常一样传递search
字符串,但正则表达式中的-
用作范围(转义在字符串文字中解析,因此它们对正则表达式没有区别):
[^0-9*+-/]
所以你的班级禁止0
到9
, *
, +
到/
,最后一个范围包括一个点和逗号(以及连字符)。 所以你应该将连字符移动到最后一个位置:
[^0-9*+/-]
或者,您应该双重转义连字符(一次用于字符串文字,再次用于正则表达式):
'[^0-9*+\\-/]'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.