2016-08-06 1 views
0

string.replace正規表現を使用してJavaScriptの電卓を作成しようとしていますが、問題が残っています。
たとえば、入力が10kの場合、kを000に置き換えようとしています。

この正規表現では、文字列kmbtkのインデックスをすべての出現箇所に置き換えようとしています。

var answer = "10k".replace(/(\d+(?:[.,]+\d+)?)([kmbt])/gi, "kmbt".indexOf("$2"));

私はこれをにconsole.logすると、それは私が欲しいものではありませんこれは、-1を返します。

したがって、正規表現を少し変更する:var answer = "10k".replace(/(\d+(?:[.,]+\d+)?)([kmbt])/gi, "$2");正しくkを返します。

返すのは0で、これは文字列 "kmbt"の文字kの位置です。このポジションでは計算を続けたいが、現在はこの問題とは関係がない。

明らかに、正規表現の 'replace'部分で関数を使用することはできません。

誰もがこの問題の解決法を知っていますか、または「置換」部分でどのように関数を使用することができますか?あなたは結果に変更を加えることができます「を置換」の部分に引数として関数を追加する必要があるので、あなたは、正規表現で直接変更を加えることはできません

ANSWER

var answer = rsn.replace(/(\d+(?:[.,]+\d+)?)([kmbt])/gi, function(match, p1, p2) { // do something with p1 and p2 and return something return p1 + p2 // for example });

答えて

3

あなたはそうのような文字列を置換する機能を使用することができます。

"10k".replace(/(\d+(?:[.,]+\d+)?)([kmbt])/gi, function(match, p1, p2) { 
    return p2; 
}); 

p1p2は置き換え、通常で"$1""$2"に対応しています。結果を返す前に、関数内で追加の変換や計算を行うことができます。文字列"kmbt"p2のインデックスを見つけるために、これは動作するはずです:

"10k".replace(/(\d+(?:[.,]+\d+)?)([kmbt])/gi, function(match, p1, p2) { 
    return "kmbt".indexOf(p2); 
}); 

このhereを行う方法についての詳細を読むことができます。

+0

あなたの答えをありがとう、これは私の問題の解決策を見つけるのを助けました! – Denny

1

最初indexOfは正規表現パターンとは関係がないため、$2は利用できません。第二の置き換えすることができます関数を取る。

var SUFFIXES = { 
    k: '000', 
    m: '000000', 
    b: '000000000', 
    t: '000000000000' 
}; 

'10k'.replace(/([\d.,]+)([kmbt])/, function (match, digits, suffix) { 
    return digits + SUFFIXES[suffix]; 
}); 
+0

最初に関数を使わずに関数を正規表現で直接使うことができなかったことは分かりませんでした。 – Denny

関連する問題