01/10/2018, 08:55

Kiểm tra chuỗi có phải biểu thức toán học hay không

Kiểm tra một chuỗi xem nó có phải là biểu thức toán học hay không:
VD:
3+7+(8-9)/10 đúng
x+y-12*(-2-z) – đúng
3*x-y/*3 --sai

Các bác giúp em dùng regex có được không ạ? hay phải duyệt chuỗi.

Sơn viết 10:56 ngày 01/10/2018

Bạn tìm hiểu thư biện này xem sao:
http://mathparser.org/

*grab popcorn* viết 10:59 ngày 01/10/2018

Bạn thử dùng pattern này xem đc ko

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

À pattern trên chỉ mới kt số thôi và chưa kt ngoặc :

Tuấn Tử Tế viết 11:09 ngày 01/10/2018

Em không hiểu về regex lắm nên ko biết làm thế nào.
Trong biểu thức thì được dùng cả tham số là chữ cái (chỉ 1 chữ) và các dấu ± có thể đặt cạnh nhau. Chẳng hạn —+2 thì vẫn là đúng. Và 2a thì phải viết là 2*a ạ.

*grab popcorn* viết 10:59 ngày 01/10/2018

Mình nghĩ nên chặn 1 số biểu thức như ----123 hay —+123.

Còn đây là pattern bổ xung kt chữ, số đi kèm dấu mình mới thử; tuy nhiên sẽ ko kiểm tra được ngoặc cũng như các biểu thức lồng nhau trong ngoặc dạng (a+b*(b+c*(d+e))) Hy vọng giúp ích được bạn,

([\-+]?(\d+(\.\d+)?|[a-zA-Z]{1})[+\-*\^])*([\-+]?(\d+(\.\d+)?|[a-zA-Z]{1}))

Các chuỗi như a+56-b*c+12.56 sẽ match

Hung viết 11:07 ngày 01/10/2018

Bạn viết bộ Parser cho Expression, gần giống như bạn viết compiler vậy.

Bước 1: Viết 1 tập các biểu thức chính quy cho các phân tử cơ bản, như:

  • Toán tử +, -, *, /, “(”, “)”,…
  • Số: 1, 1.23, 1.23e-5
  • Biến: x, y

Bước 2: Thiết lập context-free grammar (CFG), chú ý đến độ ưu tiên (priority) và thứ tự tính toán (associativity).
Expr -> SimpleExpr | ( Expr ) |
SimpleExpr = Expr | Expr + Expr | Expr - Expr

Mỗi luật trong CFG là một hàm hay 1 method.

Bước 3: Viết bộ parser nhận CFG và các biểu thức chính quy, gọi hàm parse() cho ra kết quả true, biểu thức hợp lệ, hoặc false, biểu thức không hợp lệ.


Bước 1 và bước 2 bạn viết bằng tay. Bước 3 thường dùng thư viện có sẵn. Mỗi ngôn ngữ lập trình có bộ thư viện parser riêng.

NG viết 11:11 ngày 01/10/2018
stackoverflow.com
Shah

Evaluating a math expression given in string form

java, string, math
asked by Shah on 09:53AM - 06 Aug 10

Bạn dùng cách này xem, dùng với try , exception. Nếu không có lỗi, tính được thì đúng, nếu lỗi thì sai.

Bài liên quan
0