2016-09-05 39 views
0

文字列内で数学を解析しようとしています。 x * yでは動作しますが、x*y*zでは動作しません。私はそれが文字列である一方で、もう一方は数字であると考えています。しかし、私はそれを回避する方法を見つけることができません。ここで正規表現に一致しない正規表現

は私のコードです:

var reMD = /(\d+) *[\*|\/] *(\d+)/g 
var str = '17 * 13 * 4'; 
var ex; 
runWhile(); 

function runWhile() { 
    var ex = reMD.exec(str); 
    if (ex !== null) { 
    if (ex.index === reMD.lastIndex) { 
     reMD.lastIndex++; 
    } 
    if (ex[0].indexOf('*') !== -1) { 
     var rep = parseInt(ex[1]) * parseInt(ex[2]) 
    } else { 
     var rep = parseInt(ex[1])/parseInt(ex[2]) 
    } 
    var rep = rep.toString() 
    str = str.replace(ex[0], rep) 
    if (reMD.exec(str) !== null) { 
     runWhile() 
    } 
    } 
} 
alert(str) 

アラートがバック221 * 4を送信しますが、それは884として戻ってくるはずです。どうすればこの問題を解決できますか?

+0

がどのように私はこれがそう、それはそれ見て修正します作品() 'と呼ばれていますか? – Hawkeye

答えて

1

正規表現からgフラグを削除すると動作します。.exec()を呼び出すたびに、at MDNのように新たに開始されるためです。 reMD.lastIndexと混乱しているコードを削除することもできます。

を(gフラグを指定すると、それは前の試合が終了した場所のインデックスから一致させようとしていますが、新しい文字列照合しようとしている。)

も注意してくださいあなたが一致するように正規表現を変更することができることあまりにもオペレータではなく、indexOf()を使用して、そして*/演算子は数値にそのオペランドを強要されますので、あなたは本当にparseInt()を呼び出す必要はありません。

var reMD = /(\d+) *([\*|\/]) *(\d+)/ 
 
var str = '17 * 13/4'; // note I've change the input to demostrate * and/
 
runWhile(); 
 

 
function runWhile() { 
 
    var ex = reMD.exec(str); 
 
    if (ex !== null) { 
 
    if (ex[2]==="*") { 
 
     var rep = ex[1] * ex[3] 
 
    } else { 
 
     var rep = ex[1]/ex[3] 
 
    } 
 
    rep = rep.toString() 
 
    str = str.replace(ex[0], rep) 
 
    if (reMD.exec(str) !== null) { 
 
     runWhile() 
 
    } 
 
    } 
 
} 
 
console.log(str)

(注:これは、関数で使用すると、関数の外で定義された変数を変更するために、まだ少しだらしないのですが、私はそれ以上の整頓アップ読者の練習として残しておきます...)

0

これはあなたのプロジェクトのために十分であろう場合、私は知らないが、それは `221 * 4`二度目` execのよう

'17 * 13 * 4'.replace(/(\d+)(*[\*|\/] *(\d+))*/g, eval) 
関連する問題