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
もう1つのオプションは、2番目\d+
を括弧内に移動することです。
/[-+]?\d+(\.\d+)?/g
この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 * /
この質問に答えるのが難しい理由は、数字の前または + または - の前の文字が空白または行頭であることを確認できる必要があるためです。
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 配列の正規表現は、整数、浮動小数点数、指数に対応しています。
デモはこちら
あなたの例の文字列がアイテム間にスペースを持っていることを考えると、私はむしろ次のようにします:
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;
};