РозбеÑÑÑÑ Ð²Ð¸Ñаз
ÐÑиÑмеÑиÑний виÑаз ÑкладаÑÑÑÑÑ Ð· Ð´Ð²Ð¾Ñ ÑиÑел Ñа опеÑаÑоÑÑ Ð¼Ñж ними, напÑиклад:
1 + 21.2 * 3.4-3 / -6-2 - 2
ÐпеÑаÑоÑом може бÑÑи: "+", "-", "*" або "/".
ÐодаÑÐºÐ¾Ð²Ñ Ð¿ÑобÑли можÑÑÑ Ð±ÑÑи на поÑаÑкÑ, в кÑнÑÑ Ñи вÑеÑÐµÐ´Ð¸Ð½Ñ Ð²Ð¸ÑазÑ.
ÐапиÑÑÑÑ ÑÑнкÑÑÑ parse(expr), Ñка пÑÐ¸Ð¹Ð¼Ð°Ñ Ð²Ð¸Ñаз Ñа повеÑÑÐ°Ñ Ð¼Ð°Ñив з 3-ÑоÑ
елеменÑÑв:
- ÐеÑÑе ÑиÑло.
- ÐпеÑаÑоÑ.
- ÐÑÑге ÑиÑло.
ÐапÑиклад:
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+)?.
ÐÑн мÑÑÑиÑÑ 3 ÑаÑÑини, з \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[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 Ñа 5, Ñо мÑÑÑÑÑÑ Ð´ÐµÑÑÑÐºÐ¾Ð²Ñ ÑаÑÑини (.\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
As an alternative to using the non-capturing ?:, we could name the groups, like this:
function parse(expr) {
let regexp = /(?<a>-?\d+(?:\.\d+)?)\s*(?<operator>[-+*\/])\s*(?<b>-?\d+(?:\.\d+)?)/;
let result = expr.match(regexp);
return [result.groups.a, result.groups.operator, result.groups.b];
}
alert( parse("-1.23 * 3.45") ); // -1.23, *, 3.45;