2015-11-11 133 views
-1

我需要創建一個將收到包含數學表達式的字符串,並有一個方法:評估數學表達式與正則表達式

  • 先驗證它。
  • 返回問題/問題,如果存在的話(例如,像這樣:4+3+4/04+4+(((2-2*4)-)。
  • 如果一切正常,解決它,並返回最終值。

什麼我目前做的是:

  • 我知道eval不正是我需要的,但是它有SQL注入等問題。
  • 我發現了正則表達式。

我真的不知道設計這種方法的最佳方式,它是安全的,並使用圓括號,運算符和數字。我在想的是使用正則表達式來檢查初始字符串是否等於匹配的字符串。如果是這樣,我正在考慮使用eval來計算最終值。你認爲這是正確的做法嗎?

由於不是知道我應該做什麼,我寫道:

def math_eval(expression) 
    a = /\(* \s* \d+ \s* (([-\+\*\/] \s* \d+ \)* \s*) | ([-\+\*\/] \s* \(* \s* \d+ \s*))+/ 
    puts "Let's Go" 
    puts a.match(expression) 
end 

math_eval("lets see if this works 1/ 2 * 3 hello world") 

這是返回:

Let's Go 
Empty string 

我見過的堆棧溢出的職位,這

/\(* \s* \d+ \s* (([-\+\*\/] \s* \d+ \)* \s*) | ([-\+\*\/] \s* \(* \s* \d+ \s*))+/ 

會是要使用的正確的正則表達式過濾器。

我在做什麼錯?我應該改變我的方法嗎?

編輯:我跟着不同的方法。你認爲以下方法是安全的嗎?

class FormulaCalculator 

    def formula_validator(string_formula) 
     extracted_formula = string_formula.tr('Ⓐⓐ⒜AaẠạÅåÄäẢảḀḁẤấẦầẨẩȂȃẪẫẬậẮắẰằẲẳẴẵẶặĀāĄąȀȁǺǻȦȧÁáǞǟǍǎÀàÃãǠǡÂâȺⱥÆæǢǣǼǽⱯꜲꜳꜸꜹꜺꜻⱭ℀⅍℁ªⒷⓑ⒝BbḂḃḄḅḆḇƁɃƀƂƃƄƅℬⒸⓒ⒞CcḈḉĆćĈĉĊċČčÇçƇƈȻȼℂ℃ƆꜾꜿℭ℅℆℄Ⓓⓓ⒟DdḊḋḌḍḎḏḐḑḒḓĎďƊƋƌƉĐđȡDZDzdzDŽDždžȸⅅⅆⒺⓔ⒠EeḔḕḖḗḘḙḚḛḜḝẸẹẺẻẾếẼẽỀềỂểỄễỆệĒēĔĕĖėĘęĚěÈèÉéÊêËëȄȅȨȩȆȇƎⱻɆɇƏǝℰⱸℯ℮ℇƐⒻⓕ⒡FfḞḟƑƒꜰℲⅎꟻℱ℻Ⓖⓖ⒢GgƓḠḡĜĝĞğĠġǤǥǦǧǴℊ⅁ǵĢģⒽⓗ⒣HhḢḣḤḥḦḧḨḩḪḫĤĥȞȟĦħⱧⱨꜦℍǶẖℏℎℋℌꜧⒾⓘ⒤IiḬḭḮḯIJijÍíÌìÎîÏïĨĩĪīĬĭĮįǏǐıƚỺⅈⅉℹℑℐⒿⓙ⒥JjĴĵɈɉȷⱼǰⓀⓚ⒦KkḰḱḲḳḴḵĶķƘƙꝀꝁꝂꝃꝄꝅǨǩⱩⱪĸⓁⓛ⒧LlḶḷḸḹḺḻḼḽĹĺĻļĽľĿŀŁłỈỉⱠⱡȽꝉꝈⱢLJLjljỊİịꞁ⅃⅂ȈȉȊȋℓℒⓂⓜ⒨MmḾḿṀṁṂṃꟿꟽⱮƜℳⓃⓝ⒩NnṄṅṆṇṈṉṊṋŃńŅņŇňǸǹÑñȠƞŊŋƝʼnNJNjnjȵℕ№Ⓞⓞ⒪OoÖöṎṏṌṍṐṑṒṓȪȫȬȭȮȯȰȱǪǫǬǭỌọỎỏỐốỒồỔổỖỗỘộỚớỜờỞởỠỡỢợƠơŌōŎŏŐőÒòÓóÔôÕõǑǒȌȍȎȏŒœØøǾǿꝊꝎꝏ⍥⍤ℴⓅⓟ⒫℗PpṔṕṖṗƤƥⱣℙǷꟼ℘Ⓠⓠ⒬QqɊɋℚ℺ȹⓇⓡ⒭RrŔŕŖŗŘřṘṙṚṛṜṝṞṟȐȑȒȓɌɍƦꝚꝛⱤ℞ℜℛ℟ℝⓈⓢ⒮SsṠṡṢṣṤṥṦṧṨṩŚśŜŝŞşŠšȘșȿꜱƧƨϨϩẞßẛẜẝ℠Ⓣⓣ⒯TtṪṫṬṭṮṯṰṱŢţŤťŦŧȚțȾⱦƬƮƫƭẗȶ℡™Ⓤⓤ⒰UuṲṳṴṵṶṷṸṹṺṻỦủỤụỨứỪừỬửỮữỰựŨũŪūŬŭŮůŰűǙǚǗǘǛǜŲųǓǔȔȕÛûȖȗÙùÚúÜüƯưɄƲƱⓋⓥ⒱VvṼṽṾṿɅ℣ỼⱱⱴⱽⓌⓦ⒲WwẀẁẂẃẄẅẆẇẈẉŴŵⱲⱳϢϣẘⓍⓧ⒳XxẊẋẌẍℵ×Ⓨⓨ⒴yYẎẏỾỿỲỳỴỵỶỷỸỹŶŷƳƴŸÿÝýɎɏȲȳƔẙ⅄ℽⓏⓩ⒵ZzẐẑẒẓẔẕŹźŻżŽžȤȥⱫⱬƵƶɀℨℤ', '') 
    if string_formula = extracted_formula 
      return true 
     else 
      return false 
     end 
    end 

    def formula_evaluation(string_formula) 
     if formula_validator(string_formula) == true 
      return eval(string_formula) 
     end 
    rescue Exception => e 
     puts e 
    end 
end 
+0

歡迎堆棧溢出。你問我們的意見還是答案? 「SQL注入」類似於用戶輸入表達式並且盲目執行它的情況。如果您的表達式是由您的代碼生成的或來自已知的良好來源,那麼您是安全的。你的正則表達式不起作用,因爲空間在模式上很重要。有一個標誌,使他們微不足道。你可以弄清楚它是什麼。 –

+0

檢查表達式的語法正確性通常通過將表達式轉換爲前綴或後綴形式來完成。不確定正則表達式是正確的工具。如果你不想重新發明輪子,似乎還有一個Ruby庫來構建解析器 - https://github.com/nathansobo/treetop –

+0

嗨,謝謝大家。我最終做了一些更簡單的事情。 – Richasantos

回答

1

不能使用正則表達式來識別正確形成的數學表達式。

正則表達式可以在理論上具有有限狀態自動機進行匹配,並且這樣的自動機的狀態的有限數量不能跟蹤開口的無限數量的圓括號它可能遇到的。正確匹配圓括號的語言不是regular language

你可以做什麼記號化是使用正則表達式,然後分析該標記流的字符串。

Regular expression for math operations with parentheses見。