как сопоставить это регулярные выражения в JavaScript - PullRequest
1 голос
/ 11 марта 2010

Я пытаюсь найти способ решить эту проблему, но я ПОТЕРЯЛ

Я хочу, чтобы оно совпадало с математическим уравнением, которое будет принимать строку, если:

  • "+ - * /%" в любом месте строки, но не в последнем символе входной строки
  • принимает числа с плавающей запятой и целые числа
  • не принимает буквы, только цифры и знаки

любая помощь?

Спасибо заранее !!

Ответы [ 2 ]

3 голосов
/ 11 марта 2010

Регулярное выражение, которое вы ищете, выглядит примерно так:

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

В основном это означает:

NUMBER (OPER NUMBER)*

Число определяется как:

  • Необязательный знак минус;
  • Одна или несколько цифр;
  • При желании точка, за которой следуют одна или несколько цифр.

Теперь ведущий опциональный минус не совсем соответствует вашим требованиям, поэтому вы можете спокойно отбросить его, но без него вы не сможете распознать:

-3*-4

что нарушает ваше состояние двух операндов вместе. Чтобы отбросить его, просто удалите -? из выражения (в обоих местах), то есть:

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

Также неясно, хотите ли вы принять много операндов или только один. Если это только один, то:

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

или

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

или вариант, допускающий пробелы (\s). Возможно, вы также захотите захватить группы, используя скобки.

Возможно, вы захотите изменить это определение.

Также вы можете рассмотреть вопрос о разрешении пробелов между числами и операндами.

Пример использования:

var s = "-11.32 * -34";
var r = /(-?\d+(?:\.\d+)?)\s*([*/%+-])\s*(-?\d+(?:\.\d+)?)/;
var m = r.exec(s);
if (m != null) {
  alert("First: " + m[1] + "\nOperand: " + m[2] + "\nSecond: " + m[3]);
} else {
  alert("Not found");
}
0 голосов
/ 11 марта 2010

ИЗМЕНЕНО, чтобы ответить на измененный вопрос.

  • цифра: [0-9]
  • номер: [0-9]+
  • число с необязательной десятичной частью: [0-9]+(?:\.[0-9]+)?
  • одному из этих чисел, необязательно предшествующему операции:
    ([-+/%*])?([0-9]+(?:\.[0-9]+)?)
  • один из вышеперечисленных, за которым следует ноль или более пар операция + номер:
    ([-+/%*])?([0-9]+(?:\.[0-9]+)?)(([-+/%*])([0-9]+(?:\.[0-9]+)?))*

Это не совсем уравнение, потому что нет знака =.

И вы можете заменить [0-9] на \ d в любом из вышеперечисленных. У меня есть привычка явно указывать диапазон, потому что emacs не делает \ d.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...