Проверка линейных уравнений с помощью регулярных выражений?
-
21-09-2019 - |
Вопрос
Как я могу проверить линейные уравнения с помощью регулярных выражений или есть ли другой способ, кроме использования регулярных выражений.Я буду использовать ^ для обозначения показателя степени.
2x + 3 = 8 //Это должно пройти проверку нормально
3x + 2y + 4z = 12 //Это должно пройти проверку нормально
4x^2 + 2y = 22 //Это не должно проверяться из-за мощности.
4xy + 3y = 45 //Это не должно быть подтверждено из-за произведения двух неизвестных.
2/x + 4y = 22 //Это не должно проверяться из-за неизвестного знаменателя.
(3/4)x + 3y + 2z = 40 //Это должно пройти проверку.
Решение
Я бы начал с написания определения действительного линейного уравнения, используя Бэкус-Наур обозначения, с такими вещами, как:
<integer> := <digit> | <integer> <digit>
<constant> := <integer> | ...
<variable> := <letter>
<term> := <constant> | <variable> | <constant> <variable>
и так далее.
Есть много способов превратить это в валидатор.Имея некоторый опыт работы с этим, я бы использовал yacc или bison, чтобы написать синтаксический анализатор, который генерировал бы дерево разбора только в том случае, если входные данные были допустимым линейным уравнением.
Вы можете обнаружить, что регулярные выражения слишком ограничены, чтобы делать то, что вам нужно — я просто не использую их достаточно, чтобы знать.
Другие советы
Случаи, которые вы упомянули, просты:
fail if /[xyz]\s*\^/;
fail if /\/\s*[xyz]/;
fail if /([xyz]\s*){2,}/;
(это синтаксис Perl, предполагающий $_
содержит выражение и fail
это то, что вы делаете, когда хотите сдаться.)
Здесь вы можете заменить xyz
с тем, что является допустимым выражением для одной переменной.
Но в целом это потребует фактического анализа выражения, что является работой для lex/yacc или чего-то в этом роде, а не регулярного выражения.
Например, если «xy» — допустимое имя переменной, тогда, конечно, все рушится.