2012-04-24 263 views
1

什麼正則表達式,我需要用它來糾正正則表達式替換

if (text.indexOf("+") != -1) { 
      action = "+"; 
     } else if (text.indexOf("-") != -1) { 
      action = "-"; 
     } else if (text.indexOf("*") != -1) { 
      action = "*"; 
     } else if (text.indexOf("/") != -1) { 
      action = "/"; 
     } 

這段代碼 ?

編輯:

,我怎麼能改善這個代碼:

switch (action) { 
     case "+": 
      result = parseInt(array[0]) + parseInt(array[1]); 
      break; 
     case "-": 
      result = parseInt(array[0]) - parseInt(array[1]); 
      break; 
     case "*": 
      result = parseInt(array[0]) * parseInt(array[1]); 
      break; 
     case "/": 
      result = parseInt(array[0])/parseInt(array[1]); 
      break; 
     default: 
      break; 
     } 

對不起,愚蠢的問題,我在JS新。

+0

你對位置的字符串匹配,或者你只是需要匹配? – GnrlBzik 2012-04-24 14:40:54

+0

我需要匹配 – ASD 2012-04-24 14:42:59

+0

哇@你的第二位代碼,這就是'eval'所做的一切,就像你唯一真正使用它的時間... – 2012-04-24 14:51:23

回答

4

您可以使用以下兩種:

var action = text.replace(/.*([+*/-]).*/,'$1'); 

var match = /[*+/-]/.exec(text); 
var action = match && match[0]; 

如果有換行符在你的text的可能性,則先更改爲:

var action = text.replace(/[\d\D]*([+*/-])[\d\D]*/,'$1'); 

編輯:您可以提高switch聲明通過使用,例如

// allow floating point values, and also 
// don't accidentally interpret "011" as octal 
array[0]*1 + array[1]*1; 

有關爲什麼parseInt可能是壞的,見this answer更多細節。

您還可以刪除case語句中多餘的default部分。不過,我懷疑你所期望的「改進」是減少生產線數量。鑑於=-*/運營商在JavaScript(而不是方法),我想不出任何方式來避免有四個計算(即switchif/else if)。

而在Ruby中,你可以,例如,使用array[0].send(action,array[1])覆蓋所有四個案件;)

+0

好吧,我即將發佈'action = text.match('[ - +/*]')[0];'我想你可能需要將'-'移動到開頭或字符集的結尾,因此看起來不像範圍。 – 2012-04-24 14:42:42

+0

@LeeKowalkowski已經做了,但是謝謝。 :) – Phrogz 2012-04-24 14:42:58

+0

很好的答案和wiki:) – GnrlBzik 2012-04-24 15:20:52