Regex для проверки и извлечения данных из расчета - PullRequest
0 голосов
/ 12 февраля 2019

Я пытаюсь найти регулярное выражение, в котором я могу проверить входные данные, а также извлечь необходимую информацию из входных данных.

Мой ввод содержит простые вычисления, такие как сложение, вычитание, умножение и деление.

Например: если ввод является дополнением, скажите 7.01 + 9.05

var input = '7.01+9.05';

var pattern = /^-?\d+\.?\d+[-+*\/]-?\d+\.?\d+$/
var sign;
if (input.match(pattern)) {
    var matches = pattern.exec(input);

    var left = // logic to extract value 7.01 using matches variable;
    var right = // logic to extract value 9.05 using matches variable;
    var sing = // logic to extract symbol + using matches variable;
}

Я использовал регулярное выражение, которое я нашел из этого поста: Регулярное выражение калькулятора с десятичной точкой и знаком минус

Не могли бы вы помочь мне, как извлечь необходимые данные в приведенном выше коде?

Ответы [ 3 ]

0 голосов
/ 12 февраля 2019

Конечно!

Вы должны определить группы захвата в выражении регулярного выражения, используя () и |.Важно определить глобальный флаг для вашего регулярного выражения, чтобы охватить все группы.

Вам нужно захватить 3 вещи:

  • левое число -> ^-?\d+\.?\d+
  • знак -> [-+*\/]
  • правильный номер -> -?\d+\.?\d+$

Вы должны использовать | чередование для регулярного выражения, используйте группы захвата, такие как оператор илимежду группами.

Конечное регулярное выражение будет:

var pattern = /(^-?\d+\.?\d+)|([-+*\/])|(-?\d+\.?\d+$)/g

Результатом вывода будет массив, в котором первая позиция будет левым числом, вторая позиция - знаком, а третья позиция.правильное число.

Поэтому остальная часть вашего кода будет выглядеть так:

if (input.match(pattern)) {
    var matches = input.match(pattern); \\ I recommend use input.match here too

    var left = matches[0];
    var right = matches[2];
    var sing = matches[1];
}

0 голосов
/ 12 февраля 2019

В вашем шаблоне ^-?\d+\.?\d+[-+*\/]-?\d+\.?\d+$ вы хотите сопоставить необязательную точку, используя \d+\.?\d+, которая работает, но теперь минимальное количество цифр для сопоставления равно 2 из-за совпадения 2 раз 1 или более цифр с использованием \d+, поэтому 1 + 1не будет соответствовать.

Что бы вы могли сделать, если бы это были только простые вычисления, вы можете использовать 3 группы захвата и сопоставить цифру с необязательной десятичной частью, используя ?\d+(?:\.\d+)?

Ваш шаблон может выглядетьнапример:

^(-?\d+(?:\.\d+)?)([-+*\/])(-?\d+(?:\.\d+)?)$

Пояснение

  • ^ Начало строки
  • (-?\d+(?:\.\d+)?) Группа захвата 1, соответствует 1+ цифрамс необязательной десятичной частью
  • ([-+*\/]) Группа захвата 2, сопоставьте любой из перечисленных в классе символов
  • (-?\d+(?:\.\d+)?) Группа захвата 2, сопоставьте цифры 1+ с необязательной десятичной частью
  • $ Конец строки

См. Демоверсию regex101

Например

var regex = /^(-?\d+(?:\.\d+)?)([-+*\/])(-?\d+(?:\.\d+)?)$/;
[
  "21+22",
  "7.01+9.05",
  "1-1",
  "1*1",
  "0*1000000",
  "8/4"
].forEach(x => {
  var res = x.match(regex);
  var left = res[1];
  var right = res[2];
  var sing = res[3];
  console.log(left, right, sing);
});
0 голосов
/ 12 февраля 2019

Вы можете сделать это, используя split()

var input = '7.01+9.05';

var pattern = /^-?\d+\.?\d+[-+*\/]-?\d+\.?\d+$/
if (input.match(pattern)) {
    var matches = pattern.exec(input)[0].split(/(\+|-|\*|\/)/);

    var left = matches[0];
    var right = matches[2];
    var sign = matches[1];
    console.log(left,sign,right);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...