-1
我需要創建一個將收到包含數學表達式的字符串,並有一個方法:評估數學表達式與正則表達式
- 先驗證它。
- 返回問題/問題,如果存在的話(例如,像這樣:
4+3+4/0
或4+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
歡迎堆棧溢出。你問我們的意見還是答案? 「SQL注入」類似於用戶輸入表達式並且盲目執行它的情況。如果您的表達式是由您的代碼生成的或來自已知的良好來源,那麼您是安全的。你的正則表達式不起作用,因爲空間在模式上很重要。有一個標誌,使他們微不足道。你可以弄清楚它是什麼。 –
檢查表達式的語法正確性通常通過將表達式轉換爲前綴或後綴形式來完成。不確定正則表達式是正確的工具。如果你不想重新發明輪子,似乎還有一個Ruby庫來構建解析器 - https://github.com/nathansobo/treetop –
嗨,謝謝大家。我最終做了一些更簡單的事情。 – Richasantos