Parsujte výraz
Aritmetický výraz se skládá ze 2 ÄÃsel a operátoru mezi nimi, napÅÃklad:
1 + 21.2 * 3.4-3 / -6-2 - 2
Operátor je jeden z následujÃcÃch: "+", "-", "*" nebo "/".
Na zaÄátku, na konci i mezi jednotlivými Äástmi mohou být dodateÄné mezery.
VytvoÅte funkci parsuj(výraz), která vezme výraz a vrátà pole 3 prvků:
- Prvnà ÄÃslo.
- Operátor.
- Druhé ÄÃslo.
PÅÃklad:
let [a, op, b] = parsuj("1.2 * 3.4");
alert(a); // 1.2
alert(op); // *
alert(b); // 3.4
Regulárnà výraz pro ÄÃslo je: -?\d+(\.\d+)?. VytvoÅili jsme ho v pÅedchozà úloze.
Operátor je [-+*/]. PomlÄka - je v hranatých závorkách uvedena jako prvnÃ, protože uprostÅed by znamenala rozsah znaků, ale my potÅebujeme právÄ znak -.
LomÃtko / by mÄlo být v JavaScriptovém RV /.../ pÅedznamenáno únikovým znakem, udÄláme to pozdÄji.
PotÅebujeme ÄÃslo, operátor a pak dalšà ÄÃslo. A nepovinné mezery mezi nimi.
Celý regulárnà výraz: -?\d+(\.\d+)?\s*[-+*/]\s*-?\d+(\.\d+)?.
Má 3 Äásti a mezi nimi je \s*:
-?\d+(\.\d+)?â prvnà ÄÃslo,[-+*/]â operátor,-?\d+(\.\d+)?â druhé ÄÃslo.
Aby z každé z tÄchto Äástà vznikl samostatný prvek v poli výsledků, uzavÅeme je do závorek: (-?\d+(\.\d+)?)\s*([-+*/])\s*(-?\d+(\.\d+)?).
V akci:
let rv = /(-?\d+(\.\d+)?)\s*([-+*\/])\s*(-?\d+(\.\d+)?)/;
alert( "1.2 + 12".match(rv) );
Výsledek obsahuje:
výsledek[0] == "1.2 + 12"(celá shoda)výsledek[1] == "1.2"(prvnà skupina(-?\d+(\.\d+)?)â prvnà ÄÃslo vÄetnÄ desetinné Äásti)výsledek[2] == ".2"(druhá skupina(\.\d+)?â prvnà desetinná Äást)výsledek[3] == "+"(tÅetà skupina([-+*\/])â operátor)výsledek[4] == "12"(Ätvrtá skupina(-?\d+(\.\d+)?)â druhé ÄÃslo)výsledek[5] == undefined(pátá skupina(\.\d+)?â poslednà desetinná Äást chybÃ, takže je undefined)
Chceme jen ÄÃsla a operátor, ne celou shodu nebo desetinné Äásti, takže výsledek trochu âproÄistÃmeâ.
Celou shodu (prvnà prvek pole) můžeme odstranit posunem pole výsledek.shift().
Skupiny obsahujÃcà desetinné Äásti (skupiny 2 a 4) (.\d+) můžeme vylouÄit pÅidánÃm ?: na zaÄátek: (?:\.\d+)?.
KoneÄné ÅeÅ¡enÃ:
function parsuj(výraz) {
let rv = /(-?\d+(?:\.\d+)?)\s*([-+*\/])\s*(-?\d+(?:\.\d+)?)/;
let výsledek = výraz.match(rv);
if (!výsledek) return [];
výsledek.shift();
return výsledek;
}
alert( parsuj("-1.23 * 3.45") ); // -1.23, *, 3.45
Alternativou k použità nezachytávacÃho ?: by bylo pojmenovánà skupin, napÅÃklad:
function parsuj(výraz) {
let rv = /(?<a>-?\d+(?:\.\d+)?)\s*(?<operátor>[-+*\/])\s*(?<b>-?\d+(?:\.\d+)?)/;
let výsledek = výraz.match(rv);
return [výsledek.groups.a, výsledek.groups.operátor, výsledek.groups.b];
}
alert( parsuj("-1.23 * 3.45") ); // -1.23, *, 3.45;