我想知道我在这段代码中做错了什么来检查实数:
var regex = new RegExp(/([0-9]+[\.|,][0-9]*)|([0-9]*[\.|,][0-9]+)|([0-9]+)/g);
var invalid = this.value.match(regex);
上面的表达对我来说不适用于表达式
([0-9]+[\.|,][0-9]*)|([0-9]*[\.|,][0-9]+)|([0-9]+)
在测试人员中工作。
答案 0 :(得分:5)
待办事项
var regex = new RegExp("([0-9]+[.|,][0-9])|([0-9][.|,][0-9]+)|([0-9]+)/g);([0-9]+[.|,][0-9])|([0-9][.|,][0-9]+)|([0-9]+)", 'g');
或
var regex = /([0-9]+[.|,][0-9])|([0-9][.|,][0-9]+)|([0-9]+)/g;
可能有两种结构:new RegExp(string,'g')
或/somestring/g
。不要混合它们。在你的regexp常量的情况下,选择第二个是更有效的,因为它是预编译的。
答案 1 :(得分:2)
首先,您不需要对不在字符串中的正则表达式执行new RegExp()
。
/regexp/rule
或new RegExp("regexp", "rule");
其次:
如果您可以使用[0-9]
?
\d
?
第三
为什么使用[.|,]
?你想要匹配|藏汉? [.,]
将完成你想要实现的工作。
第四:
根据数字字符串检查:/^(?:[1-9]\d{0,2}(?:,\d{3})*|0)(?:\.\d+)?$/
var regexp = /^(?:[1-9]\d{0,2}(?:,\d{3})*|0)(?:\.\d+)?$/;
alert(regexp.test("0")); // true
alert(regexp.test("1")); // true
alert(regexp.test("01")); // false (or check out the regex at the bottom)
alert(regexp.test("123")); // true
alert(regexp.test("1234")); // false
alert(regexp.test("123,4")); // false
alert(regexp.test("123,456,789,012")); // true
alert(regexp.test("123,456,789,012.")); // false
alert(regexp.test("123,456,789,012.12341324")); // true
alert(regexp.test("0.12341324")); // true
如果您想要匹配0,000,000.0000之类的东西,您也可以使用此正则表达式:
/^\d{1,3}(?:,\d{3})*(?:\.\d+)?$/
如果您想要+ - 在前面,您可以添加Bergi提到的内容。 我的正则表达式看起来像这样:
/^[+-]?\d{1,3}(?:,\d{3})*(?:\.\d+)?$/
或:/^[+-]?(?:[1-9]\d{0,2}(?:,\d{3})*|0)(?:\.\d+)?$/
,
替换为\.
,将\.
替换为,
有替换的表达式,和。
/^?\d{1,3}(?:\.\d{3})*(?:,\d+)?$/ <- matches 00,000,000.00000
/^?(?:[1-9]\d{0,2}(?:\.\d{3})*|0)(?:,\d+)?$/ <- matches 1,123,123,123.1234
/^[+-]?\d{1,3}(?:\.\d{3})*(?:,\d+)?$/ <- matches -00,000.0
/^[+-]?(?:[1-9]\d{0,2}(?:\.\d{3})*|0)(?:,\d+)?$/ <- matches -12,123.12345
答案 2 :(得分:1)
我建议:
/[+-]?(?:\d*[.,])?\d+/
它使用快捷方式\d
而不是[0-9]
,我也不认为您希望将管道匹配为小数分隔符。方括号定义character class,其中特殊字符松散其含义(.
不需要转义,|
不代表OR) - 您可能意味着(\.|,)
。另外我不确定你是否真的想要匹配没有十进制数字的floas(例如"12,"
) - 我省略了它们;我在开头就允许了一个可选的标志。