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.
Bài liên quan
Bạn tìm hiểu thư biện này xem sao:
http://mathparser.org/
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 :
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 ạ.
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ẽ matchBạ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ư:
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.
Evaluating a math expression given in string form
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.