我有一个自定义正则表达式,用于检测整数、分数和浮点数。
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*)?$/
对我来说,这个正则表达式比你的原始正则表达式更容易阅读,但这当然取决于你。