РазобÑаÑÑ Ð²ÑÑажение
ÐÑиÑмеÑиÑеÑкое вÑÑажение вклÑÑÐ°ÐµÑ Ð´Ð²Ð° ÑиÑла и опеÑаÑÐ¾Ñ Ð¼ÐµÐ¶Ð´Ñ Ð½Ð¸Ð¼Ð¸. ÐапÑимеÑ:
1 + 21.2 * 3.4-3 / -6-2 - 2
ÐпеÑаÑоÑом Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ: "+", "-", "*" или "/".
РвÑÑажении могÑÑ Ð±ÑÑÑ Ð¿ÑÐ¾Ð±ÐµÐ»Ñ Ð² наÑале, в конÑе или Ð¼ÐµÐ¶Ð´Ñ ÑаÑÑÑми вÑÑажениÑ.
СоздайÑе ÑÑнкÑÐ¸Ñ parse(expr), коÑоÑÐ°Ñ Ð¿ÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð²ÑÑажение и возвÑаÑÐ°ÐµÑ Ð¼Ð°ÑÑив из ÑÑÑÑ
ÑлеменÑов:
- ÐеÑвое ÑиÑло.
- ÐпеÑаÑоÑ.
- ÐÑоÑое ÑиÑло.
ÐапÑимеÑ:
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+)?.
Ðно ÑоÑÑÐ¾Ð¸Ñ Ð¸Ð· ÑÑÑÑ
ÑаÑÑей, Ð¼ÐµÐ¶Ð´Ñ ÐºÐ¾ÑоÑÑми ÑÑÐ¾Ð¸Ñ \s*:
-?\d+(\.\d+)?â пеÑвое ÑиÑло,[-+*/]â опеÑаÑоÑ,-?\d+(\.\d+)?â вÑоÑое ÑиÑло.
ÐÐ»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ ÑÑиÑ
ÑаÑÑей в виде оÑделÑнÑÑ
ÑлеменÑов маÑÑива-ÑезÑлÑÑаÑа давайÑе вÑÑавим Ñкобки вокÑÑг каждой из ниÑ
, полÑÑиÑÑÑ (-?\d+(\.\d+)?)\s*([-+*/])\s*(-?\d+(\.\d+)?).
РдейÑÑвии:
let regexp = /(-?\d+(\.\d+)?)\s*([-+*\/])\s*(-?\d+(\.\d+)?)/;
alert( "1.2 + 12".match(regexp) );
РезÑлÑÑÐ°Ñ result вклÑÑÐ°ÐµÑ Ð² ÑебÑ:
result[0] == "1.2 + 12"(полное Ñовпадение)result[1] == "1.2"(пеÑÐ²Ð°Ñ Ð³ÑÑппа(-?\d+(\.\d+)?)â пеÑвое ÑиÑло, вклÑÑÐ°Ñ Ð´ÐµÑÑÑиÑнÑÑ ÑаÑÑÑ)result[2] == ".2"(вÑоÑÐ°Ñ Ð³ÑÑппа(\.\d+)?â пеÑÐ²Ð°Ñ Ð´ÐµÑÑÑиÑÐ½Ð°Ñ ÑаÑÑÑ)result[3] == "+"(ÑÑеÑÑÑ Ð³ÑÑппа([-+*\/])â опеÑаÑоÑ)result[4] == "12"(ÑеÑвÑÑÑÐ°Ñ Ð³ÑÑппа(-?\d+(\.\d+)?)â вÑоÑое ÑиÑло)result[5] == undefined(пÑÑÐ°Ñ Ð³ÑÑппа(\.\d+)?â вÑоÑÐ°Ñ Ð´ÐµÑÑÑиÑÐ½Ð°Ñ ÑаÑÑÑ Ð¾ÑÑÑÑÑÑвÑеÑ, поÑÑÐ¾Ð¼Ñ Ð·Ð½Ð°Ñениеundefined)
Ðам Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ñ ÑолÑко ÑиÑла и опеÑаÑÐ¾Ñ Ð±ÐµÐ· полного ÑÐ¾Ð²Ð¿Ð°Ð´ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ деÑÑÑиÑной ÑаÑÑи, поÑÑÐ¾Ð¼Ñ Ð´Ð°Ð²Ð°Ð¹Ñе «поÑиÑÑим» ÑÑÐ¾Ñ ÑезÑлÑÑаÑ.
ÐеÑвÑй ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¼Ð°ÑÑива (полное Ñовпадение) можно ÑдалиÑÑ Ð¿Ñи помоÑи Ñдвига маÑÑива result.shift().
ÐÑÑппÑ, коÑоÑÑе ÑодеÑÐ¶Ð°Ñ Ð´ÐµÑÑÑиÑнÑÑ ÑаÑÑÑ (Ð½Ð¾Ð¼ÐµÑ 2 и 4) (.\d+) можно ÑбÑаÑÑ Ð¸Ð· маÑÑива, добавив ?: в наÑало: (?:\.\d+)?.
ÐÑоговое ÑеÑение:
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