我希望能够从 JavaScript 中的字符串中提取所有数字(包括浮点数)。
"-5. -2 3.1415 test 2.4".match(...)
返回
["-2", "3.1415", "2.4"]
到目前为止,我有/[-+]?(\d*\.?\d+)/g
,但这似乎5
与其他数字一起返回。我想避免这种情况,因为在字符串中“单词”是 5。而不是 5 或 5.0。有什么提示吗?
我希望能够从 JavaScript 中的字符串中提取所有数字(包括浮点数)。
"-5. -2 3.1415 test 2.4".match(...)
返回
["-2", "3.1415", "2.4"]
到目前为止,我有/[-+]?(\d*\.?\d+)/g
,但这似乎5
与其他数字一起返回。我想避免这种情况,因为在字符串中“单词”是 5。而不是 5 或 5.0。有什么提示吗?
如果您不想包含该点,那么前瞻将是有意义的:
/[-+]?\d*(\.(?=\d))?\d+/g
另一种选择是将第二个移动\d+
到括号内:
/[-+]?\d+(\.\d+)?/g
这个问题难以回答的原因是您需要能够检查数字之前或 + 或 - 之前的字符是空格还是行首。
由于 JavaScript 没有能力通过.match()
在字符串上使用该方法来寻找解决方案,这几乎是不可能的。鉴于此,这是我的解决方案。
var extractNumbers = (function ( ) {
numRegexs = [
/( |^)([+-]?[0-9]+)( |$)/g,
/( |^)([+-]?[0-9]+\.[0-9]+)( |$)/g,
/( |^)([+-]?[0-9]+\.[0-9]+([eE][+-])?[0-9]+)( |$)/g
];
return function( str ) {
var results = [], temp;
for( var i = 0, len = numRegexs.length; i < len; i++ ) {
while( temp = numRegexs[i].exec( str ) ) {
results.push( temp[2] );
}
}
return results;
}
}( ));
numRegexs 数组中的正则表达式对应于整数、浮点数和指数数。
演示在这里
此 rx 获取以字符串表示的数字,带或不带符号、小数或指数格式 -
rx=/[+-]?((.\d+)|(\d+(.\d+)?)([eE][+-]?\d+)?)/g
String.prototype.getNums= function(){
var rx=/[+-]?((\.\d+)|(\d+(\.\d+)?)([eE][+-]?\d+)?)/g,
mapN= this.match(rx) || [];
return mapN.map(Number);
};
var s= '室外-40度无所谓'+
“7朵玫瑰花14.35美元,7艘潜艇1.435e+9美元。”;
s.getNums();
/* 返回值:(数组)-40, 7, 14.35, 7, 1435000000 */
鉴于您的示例字符串在项目之间有空格,我宁愿这样做:
var tokens = "-5. -2 3.1415 test 2.4".split(" ");
var numbers = [];
for( var i = 0 ; i < tokens.length ; i++ )
if( isNumber( tokens[i]) )
numbers.push( tokens[i]*1 );
//numbers array should have all numbers
//Borrowed this function from here:
//http://stackoverflow.com/questions/18082/validate-numbers-in-javascript-isnumeric
function isNumber(n) {
return !isNaN(parseFloat(n*1)) && isFinite(n*1) && !endsWith(n,".");
}
endsWith = function( s , suffix ) {
return s.indexOf(suffix, s.length - suffix.length) !== -1;
};