2012-11-30 34 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; 
};