繁体   English   中英

正则表达式点和逗号问题

[英]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*+-/]

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

[^0-9*+/-]

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM