Ifodani tahlil qilish
Arifmetik ifoda 2 ta raqam va ular orasidagi operatordan iborat, masalan:
1 + 2
1.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