質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

3回答

1311閲覧

【JavaScript】与えられた文字列が数式かどうか判定したい

kimkim

総合スコア142

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2018/07/12 06:05

前提・実現したいこと

数式("5+3"など)が入るか普通の文字列("abc")が入るかわからない変数を
用意して、それが数式ならその計算結果、数式じゃなければ"not correct"を
出力させたいです。

発生している問題・エラーメッセージ

変数stringが数式の時は大丈夫なのですが普通の文字列の時に
以下のようなエラーが出てしまいます。

ReferenceError: abc is not defined at eval (eval at <anonymous> (script 15:10), <anonymous>:1:1) at script 15:10

該当のソースコード

JavaScript

1//var string = "6+5"; 2var string = "abc"; 3 4if(isNaN(eval(string))){ 5 //数式じゃなかったとき 6 console.log("ERROR"); 7} else{ 8 //数式だった時 9 console.log(String(eval(string))); 10}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2018/07/12 06:06

何のためにこのようなことを?
kimkim

2018/07/12 06:15

返信ありがとうございます。今作成しているゲームでやりたい処理がjavascriptだと簡単にできるっぽいとネットに書いてあったのでjavascript未経験ながら試して見たらなぜかできなくて疑問に思ったからです!
guest

回答3

0

ちゃんとやりたければ、 PEG.js とか使ってみてはいかがでしょうか。

計算式をパースしている例 : https://tnomura9.exblog.jp/12702074/

投稿2018/07/12 06:40

mather

総合スコア6753

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

まずevalは任意コード実行なので、
公開すると世界中のクラッカーやエンジニアのおもちゃにされます。
なので、どのリファレンスでも「evalは使うな!」と口を酸っぱくして言われる程です。

MDNでも必要以上にevalを使用しないで!とアナウンスしていますね。

ユーザーからの入力値を使う場合は絶対にevalを経由してはいけません。
1文字ずつ解析して計算する計算機を別途開発すべき案件です。

もしユーザーからの入力値を利用しない場合、
最初から計算後の数値にして持っておくか、関数化しろという話です。


以上の前提を踏まえた上で、
仲間内で使うだけだから横着したいという話ならtry-catchでエラーが出たら握りつぶすのはどうですか?

JavaScript

1try{ 2 eval("abc"); 3}catch(e){ 4 console.log(123); 5} 6// 123が表示される

この様にevalをtry-catchで包む事で計算できない単語が出現してエラーになった場合でも、catch側の回避コードを実行してくれます。


「おまけ」

こういったネタは結構ありがちなので、きっとライブラリが転がってるはず…
ググってたらJSが得意なthink49さんが作ってアップしてますね。
https://gist.github.com/think49/54b074cab2145efddb48765652c74710

ざっとコードを斜め読みしましたが、四則演算対応かつevalを使わない設計ということで、
計算速度は知りませんが、ある程度の運用に耐えるんじゃないでしょうか?

abcという文字列対策にSyntaxErrorを返すということで、
私の回答文にあったtry-catchで包むテクニックと併用すればいい感じになると思います。

投稿2018/07/12 06:33

編集2018/07/12 06:40
miyabi-sun

総合スコア21158

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kimkim

2018/07/12 06:53

回答ありがとうございます! try-catchも知らなかったので、ぜひ参考にしたいとおもい今回はこちらをベストアンサーにさせていただきました。 また「おまけ」にあるgithubも参考にしていきたいと思います。 皆さんも回答ありがとうございました!
guest

0

「式」の定義次第でしょうね

  • 数値のみ:「1」
  • 数値の間の四則演算子:「1+2*3」
  • 数字と四則演算子の間のスペース:「1 + 2 *3」
  • 四則演算子のあとのプラスマイナス:「1-+2*-3」
  • かっこ:「1*(2+3)」
  • 多重かっこ:「1*((2-3)/(4+53))」

どれがよくてどれが駄目をよく練らないといけません

投稿2018/07/12 06:18

yambejp

総合スコア114572

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問