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

Vid*_*idi 1 javascript regex

我有一个自定义正则表达式,我用它来检测整数,分数和浮点数.

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

(代码也可以在这里找到:http://jsfiddle.net/aNb3L/.)

问题是,对于一个匹配的单个字母,我无法弄清楚原因.但是对于更多的字母,它失败了(这很好).

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

Poi*_*nty 5

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

var regEx = /^((^[1-9]|(0\.)|(\.))([0-9]+)?((\s|\.)[0-9]+(\/[0-9])?)?)$/;
Run Code Online (Sandbox Code Playgroud)

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

因此你的工作也会这样:

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

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

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