別の正規表現の質問: 私は JavaScript コードに取り組んでおり、ハイフン間の float または int 数値を抽出する必要があります。このような:
var string="someText-180.5-200.70-someOtherText";
私は取得する必要があります:
var number1="180.5";
var number2="200.70";
なにか提案を?(私は正規表現が苦手です..grrr)
ありがとう!
別の正規表現の質問: 私は JavaScript コードに取り組んでおり、ハイフン間の float または int 数値を抽出する必要があります。このような:
var string="someText-180.5-200.70-someOtherText";
私は取得する必要があります:
var number1="180.5";
var number2="200.70";
なにか提案を?(私は正規表現が苦手です..grrr)
ありがとう!
問題の 1 つは、正規表現が "-180.5-" と一致することです。次の一致は "200.70-someOtherText" 文字列で検索されるため、次の検索実行で 200.70 と一致しない場合...正規表現を書くだけではありません。
私の魂では、文字列の検査された部分を切り取り、文字列の他の部分で正規表現を再度実行します..一致している間に実行します。
以下のコードを参照してください。
function findAllINeed(str){
result = [];
while ((match = /(?:\-)(([0-9]+)\.?([0-9]*))(?:\-)/.exec(str)) != null) {
str = str.substr(match.index + match[1].length)
result.push(parseFloat(match[1]));
}
return result;
}
私はこれを試しました:
findAllINeed("someText-180.5-200.70-someOtherText sd sdf -6 -6.777 7- s 4.55 -4-sdfsdfsdf -45.77-4-")
[180.5, 200.7, 4, 45.77, 4]
-6、-6.7777、4.55、7- ... には一致しません。
しかし、「-」文字の間のすべての正の浮動小数点数または整数を見つけてください。これがお役に立てば幸いです。
次の正規表現を使用して、探しているものを実現できます。
[0-9]*\.?,?[0-9]+
他の RegExp ベースのソリューションも機能しますが、ここでは正規表現を使用しないソリューションを提案します。これに対する私の動機は、正規表現は読み取り、変更、および/またはデバッグが難しい場合があるということです。
このコードは、文字列からすべての浮動小数点数を含む配列を返します (浮動小数点数が正であると仮定します)。
"someText-180.5-200.70-someOtherText".split("-"). //splits by hyphens
map(function(elem){
return parseFloat(elem);//convert each part to float
}).filter(function(elem){
return elem===elem;//filter out the not-a-numbers,
// that is, stuff converting to float failed on
});
これmap/filter
に慣れている場合は、「機能的」ではない方法を使用せずに行うこともできます。コードの読みやすさは非常に重要であり、独自のコードに慣れる必要があると思います。できるよ
var str = "someText-180.5-200.70-someOtherText";
var splitStr = str.split("-");
var arrayOfFloats = [];
for(var i=0;i<splitStr.length;i++){
var asFloat = parseFloat(splitStr[i]);
if(asFloat===asFloat){ //check for NaN, that is parse float fails
arrayOfFloats.push(asFloat);
}
}
//now arrayOfFloats contains all the floats in your expression
最初と最後の部分を一致させたくない場合 (つまり、厳密にハイフンの間slice
にあるフロートのみ) 要素を最初に一致させることができます :)
この正規表現を使用できます:
var string="someText-180.5-200.70-someOtherText";
var match = string.match(/.*?(\d+(\.\d+)?).*?(\d+(\.\d+)?)/);
console.log(match[1]); // prints 180.5
console.log(match[3]); // prints 200.70
var numbers = string.match(/[\d.]+/g)
または、複数のピリオドが無効な数値を作成することを懸念している場合:
var numbers = string.match(/\d+(\.\d+)?/g)