式をパースする
算術式は2つの数字とそれらの間の演算子で構成されます。:
1 + 2
1.2 * 3.4
-3 / -6
-2 - 2
演算子は "+"
, "-"
, "*"
または "/"
のいずれかです。
先頭や末尾、間に余分なスペースがあるかもしれません。
式を取り、3つのアイテムを持つ配列を返す parse(expr)
を作成してください。
- 最初の数値
- 演算子
- 2番目の数値
例:
let [a, op, b] = parse("1.2 * 3.4");
alert(a); // 1.2
alert(op); // *
alert(b); // 3.4
数値の正規表現は: -?\d+(\.\d+)?
です。前のタスクで作ったものです。
演算子は、[-+*/]
です。ダッシュ -
を先頭に置きます。中央にある場合、ダッシュは文字の範囲を意味しますが、それは必要ないからです。
JavaScript の正規表現 /.../
の中ではスラッシュをエスケープする必要があることに注意してください。
私たちは、数値、演算子、そして別の数値が必要です。そしてそれらの間にスペースがある場合があります。
完全な正規表現は次のようになります: -?\d+(\.\d+)?\s*[-+*/]\s*-?\d+(\.\d+)?
.
配列として結果を取得するため、必要なデータの周りに括弧を置きましょう: 数値と演算子です: (-?\d+(\.\d+)?)\s*([-+*/])\s*(-?\d+(\.\d+)?)
.
動作:
let reg = /(-?\d+(\.\d+)?)\s*([-+*\/])\s*(-?\d+(\.\d+)?)/;
alert( "1.2 + 12".match(reg) );
結果は次の内容を含みます:
result[0] == "1.2 + 12"
(完全なマッチ)result[1] == "1"
(最初の括弧)result[2] == "2"
(2番目の括弧 – 小数部(\.\d+)?
)result[3] == "+"
(…)result[4] == "12"
(…)result[5] == undefined
(最後は小数部がないので undefined です)
必要なのは数値と演算子だけです。小数部だけは不要です。
なので、(?:\.\d+)?
のように、?:
を追加することで、キャプチャグループから余分なグループを取り除きましょう。
最終的な解法は次の通りです:
function parse(expr) {
let reg = /(-?\d+(?:\.\d+)?)\s*([-+*\/])\s*(-?\d+(?:\.\d+)?)/;
let result = expr.match(reg);
if (!result) return;
result.shift();
return result;
}
alert( parse("-1.23 * 3.45") ); // -1.23, *, 3.45