Проверка линейных уравнений с помощью регулярных выражений?

StackOverflow https://stackoverflow.com/questions/1570233

  •  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» — допустимое имя переменной, тогда, конечно, все рушится.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top