2012-11-30 21 views
3

我希望能够从JavaScript中的字符串中提取所有数字(包括浮点数)。在JavaScript中提取字符串中的所有数字

"-5. -2 3.1415 test 2.4".match(...) 

回报

["-2", "3.1415", "2.4"] 

到目前为止,我有/[-+]?(\d*\.?\d+)/g,但这似乎与其他数字一起返回5。我想避免这种情况,因为在字符串中,“单词”是5.而不是5或5.0。任何提示?

+2

什么之类的东西'.5'?小数点的两边是否必须填写? –

+0

-1因为你的问题陈述和数据不同意。请保持一致和准确。此外,我“相当肯定”这已经做了很多次.. – 2012-11-30 00:01:50

+0

@pst:他的问题是,他不想'5'。被认定为有效的号码。你的理解是不符合问题陈述。 – slebetman

回答

2

如果你想不包括点,前瞻将使意义:

/[-+]?\d*(\.(?=\d))?\d+/g 

另一种选择是将第二\d+括号内:

/[-+]?\d+(\.\d+)?/g 
+0

PS。什么是指数(例如'3.14E-1')? –

+0

我没有抓住指数 – victormejia

+0

第二个选项会匹配'-'和'+'作为数字。 –

1

这Rx取得数字以字符串表示,带或不带符号,小数或指数格式 -

rx =/[+ - ]?((。\ d +)|(\ d +(。\ d +)?)([eE] [ + - ] \ d +)?)/克

String.prototype.getNums= function(){ 
    var rx=/[+-]?((\.\d+)|(\d+(\.\d+)?)([eE][+-]?\d+)?)/g, 
    mapN= this.match(rx) || []; 
    return mapN.map(Number); 
}; 

变种S = '当它是外-40度,它不\' 吨重要的是 '+

' 7个玫瑰花费$ 14.35和7级潜艇花费$ 1.435e +9“。

s.getNums();

/*返回值:(阵列) -40,7,14.35,7,14.35亿 */

1

原因这个问题很难回答,是你必须能够检查字符在数字之前或在+或 - 之前是空格或行首。

由于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数组中的正则表达式对应于整数,浮点数和指数数。

演示here

0

鉴于您的例子字符串的项目之间的空间,我宁愿做:

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; 
};