1

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

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/它不匹配单个字母

4

2 回答 2

5

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

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 或其他方式传递到您的代码时。

于 2012-10-03T17:53:34.883 回答
1

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

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

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

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

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

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

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

于 2012-10-03T17:59:22.243 回答