Ifodani tahlil qilish
Arifmetik ifoda 2 ta raqam va ular orasidagi operatordan iborat, masalan:
1 + 21.2 * 3.4-3 / -6-2 - 2
Operator quyidagilardan biri: "+", "-", "*" yoki "/".
Boshida, oxirida yoki qismlar oârtasida qoâshimcha boâshliqlar boâlishi mumkin.
Ifodani qabul qiluvchi va 3 ta elementdan iborat massivni qaytaruvchi parse(expr) funksiyasini yarating:
- Birinchi raqam.
- Operator.
- Ikkinchi raqam.
Masalan:
let [a, op, b] = parse("1.2 * 3.4");
alert(a); // 1.2
alert(op); // *
alert(b); // 3.4
Arifmetik ifoda tahlilchisi
Raqam uchun regexp: -?\d+(\.\d+)?. Buni oldingi vazifada yaratgan edik.
Operator [-+*/]. Tire - kvadrat qavslarda birinchi oârinda turadi, chunki oârtada boâlsa belgilar diapazonini bildiradi, biz esa shunchaki - belgisini xohlaymiz.
Qiyshiq chiziq / JavaScript regexp /.../ ichida ekranlanishi kerak, buni keyinroq qilamiz.
Bizga raqam, operator, keyin yana raqam kerak. Va ular orasida ixtiyoriy boâshliqlar.
Toâliq doimiy ifoda: -?\d+(\.\d+)?\s*[-+*/]\s*-?\d+(\.\d+)?.
Unda \s* bilan ajratilgan 3 ta qism bor:
-?\d+(\.\d+)?â birinchi raqam,[-+*/]â operator,-?\d+(\.\d+)?â ikkinchi raqam.
Bu qismlarning har birini natijalar massivining alohida elementi qilish uchun ularni qavslarga oâraylik: (-?\d+(\.\d+)?)\s*([-+*/])\s*(-?\d+(\.\d+)?).
Amalda:
let regexp = /(-?\d+(\.\d+)?)\s*([-+*\/])\s*(-?\d+(\.\d+)?)/;
alert("1.2 + 12".match(regexp));
Natija quyidagilarni oâz ichiga oladi:
result[0] == "1.2 + 12"(toâliq moslik)result[1] == "1.2"(birinchi guruh(-?\d+(\.\d+)?)â birinchi raqam, oânli qism bilan birga)result[2] == ".2"(ikkinchi guruh(\.\d+)?â birinchi oânli qism)result[3] == "+"(uchinchi guruh([-+*\/])â operator)result[4] == "12"(toârtinchi guruh(-?\d+(\.\d+)?)â ikkinchi raqam)result[5] == undefined(beshinchi guruh(\.\d+)?â oxirgi oânli qism yoâq, shuning uchun undefined)
Bizga faqat raqamlar va operator kerak, toâliq moslik yoki oânli qismlar emas, shuning uchun natijani biroz âtozalaylikâ.
Toâliq moslikni (massivning birinchi elementi) massivni siljitish result.shift() orqali olib tashlash mumkin.
Oânli qismlarni oâz ichiga olgan guruhlar (2 va 4 raqamli) (.\d+) ni boshiga ?: qoâshish orqali chiqarib tashlash mumkin: (?:\.\d+)?.
Yakuniy yechim:
function parse(expr) {
let regexp = /(-?\d+(?:\.\d+)?)\s*([-+*\/])\s*(-?\d+(?:\.\d+)?)/;
let result = expr.match(regexp);
if (!result) return [];
result.shift();
return result;
}
alert(parse("-1.23 * 3.45")); // -1.23, *, 3.45