Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Как разобрать математическое выражение
Форумы портала PHP.SU » PHP » Регулярные выражения » Как разобрать математическое выражение

Страниц (1): [1]
 

1. Perun - 10 Февраля, 2021 - 19:53:34 - перейти к сообщению
Подсобите с регуляркой. Нужно математическое выражение, например:

аb+4*(-x-222*b)+cbd

разбирать так, чтобы отдельно в лексемы попадали символьные переменные(из одного и больше символов, без цифр), цифровые константы из одной и более цифр и отдельно +, -, * ,(,).

Выражения могут быть на входе абсолютно разные по длине, набору пересчисленных операторов, с разными константами и переменными.
Это вообще возможно? Или тут нужно писать свою функцию?
2. dcc0 - 11 Февраля, 2021 - 01:06:22 - перейти к сообщению
Доброго! Что-то типа такого? https://rextester[dot]com/CBOUY47630
В вашем примере символ "а" , видимо, русский символ.

P.s. на всякий случай за ошибки извиняюсь, с телефона.
3. Perun - 11 Февраля, 2021 - 08:41:48 - перейти к сообщению
dcc0 пишет:
Что-то типа такого?

Почти..
Все лексемы должны быть в одном одномерном массиве и идти подряд, как они идут в выражении. Вместо одной лексемы *(-, должно быть три разных.

Т.е. должно быть:
[
ab,
+,
4,
*,
(,
-,
x,
-,
222,
*,
b,
),
+,
cbd,
]
4. dcc0 - 11 Февраля, 2021 - 11:10:39 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3.  
  4.  $str="ab+4*(-x-222*b)+cbd";
  5. preg_match_all("/[a-z]{1,}|[0-9]{1,}|[^0-9a-z]/", $str, $m);
  6. print_r($m);
  7. ?>
  8.  


Output:

CODE (html):
скопировать код в буфер обмена
  1. Array
  2. (
  3.     [0] => Array
  4.         (
  5.             [0] => ab
  6.             [1] => +
  7.             [2] => 4
  8.             [3] => *
  9.             [4] => (
  10.             [5] => -
  11.             [6] => x
  12.             [7] => -
  13.             [8] => 222
  14.             [9] => *
  15.             [10] => b
  16.             [11] => )
  17.             [12] => +
  18.             [13] => cbd
  19.         )
  20.  
  21. )

Так?
5. Perun - 11 Февраля, 2021 - 11:17:28 - перейти к сообщению
Да, спасибо.
6. Perun - 15 Февраля, 2021 - 14:40:29 - перейти к сообщению
А можно ли исходное выражение проверить с помощью РВ?
Условий получается очень много и сложных. Похоже на что то нереальное)

-В начале выражения может быть знак минус, может и не быть
-Любой операнд выражения может быть или переменой или константой
-Скобки могут быть в любом месте выражения.
-В конце/начале выражения не должно быть оператора кроме + или - в начале
-В середине выражения не должно идти подряд несколько операторов
-Скобки должны соответствовать открывающие закрывающим

Или это все нужно отдельно обрабатывать после разбиения на лексемы? Или делать отдельно проверку на соответствие каждому граничному условию?
Самая сложная часть- скобки..

 

Powered by ExBB FM 1.0 RC1