自定义 JavaScript 正则表达式的问题



我有一个自定义正则表达式,用于检测整数、分数和浮点数。

var regEx = new RegExp("^((^[1-9]|(0.)|(.))([0-9]+)?((s|.)[0-9]+(/[0-9])?)?)$");
var quantity = 'd';
var matched = quantity.match(regEx);
alert(matched);

(代码也可在此处找到:http://jsfiddle.net/aNb3L/.)

问题是对于一个字母,它匹配,我不知道为什么。但是对于更多的字母,它失败了(这很好)。

免责声明:我是正则表达式的新手,尽管 http://gskinner.com/RegExr/它与单个字母不匹配

使用直接正则表达式语法更容易:

var regEx = /^((^[1-9]|(0.)|(.))([0-9]+)?((s|.)[0-9]+(/[0-9])?)?)$/;

使用 RegExp 构造函数时,必须在反斜杠上加倍。实际上,您的代码只有一个反斜杠,因此.子表达式被视为. - 这就是单个非数字字符的溜走方式。

因此,您的也将以这种方式工作:

var regEx = new RegExp("^((^[1-9]|(0\.)|(\.))([0-9]+)?((\s|\.)[0-9]+(/[0-9])?)?)$");

发生这种情况是因为字符串语法使用反斜杠作为引号机制。当您的正则表达式首次解析为字符串常量时,如果不将它们加倍,则会去除这些反斜杠。 当字符串被传递给正则表达式解析器时,它们就消失了。

真正需要使用RegExp构造函数的唯一时间是动态构建正则表达式时,或者通过 JSON 或其他方式将其传递给代码时。

好吧,对于整数,这将是您的正则表达式:

/^(0|[1-9]d*)$/

然后你必须考虑浮点数的可能性:

/^(0|[1-9]d*)(.d+)?$/

然后你必须考虑一小部分的可能性:

/^(0|[1-9]d*)((.d+)|(/[1-9]d*)?$/

对我来说,这个正则表达式比你的原始正则表达式更容易阅读,但这当然取决于你。

最新更新