2015-05-27 19 views
5

Tôi đang tạo một trình phân tích cú pháp các loại trong javascript có một biểu thức toán học được đặt cho tập lệnh dưới dạng chuỗi và đánh giá nó và thực hiện một số thứ khác với nó. Nếu người dùng muốn sử dụng các hàm toán học Javascript dựng sẵn, họ phải nhập chuỗi sau, ví dụ: "1 + Math.log (x)". Điều đó trở nên rất tẻ nhạt khi mọi thứ được lồng vào nhau, ví dụ: Math.abs (Math.log (Math.pow (x, 2))) + Math.log2 (x) ". Như bạn có thể thấy, "Toán". một phần của nó không chỉ mất nhiều thời gian để viết, nhưng làm cho nó ít có thể đọc được. Tôi muốn xóa "Math" đó. phần. Cách tôi đã thực hiện nó là sử dụng regex đơn giản về cơ bản có một danh sách tất cả các hằng số và phương thức toán học Javascript và chỉ đơn giản là thêm vào "Math". phần của nó. Đơn giản đủ:Regex thay thế mọi thứ không bắt đầu bằng nhiều lần trong dòng

input = input.replace(/(E|PI|SQRT2|SQRT1_2|LN2|LN10|LOG2E|LOG10E)/g, "Math.$1"); 

Điều tương tự cũng xảy ra đối với phương pháp. Điều này hoạt động tốt. Nhưng như mọi khi không phải là rất linh hoạt và để lại chỗ cho sự hiểu lầm và ai đó có thể hôn mê và khăng khăng gõ Math.log (x) mà sẽ lần lượt được thay thế bằng Math.Math.log (x), nó sẽ không hoạt động. Điều tôi muốn biết là, có cách nào đó để phù hợp với bất kỳ chuỗi được xác định trước nào (hằng số và phương thức) để chúng chỉ được kết hợp thông qua regex nếu chúng không có "Math" hay không. một phần trước mặt nó. Tôi đã cố gắng này

^(?!Math\.)(log2|log|exp|abs) 

nhưng nó là khá vô dụng, vì điều này không làm việc với toán hạng làm tổ và thậm chí là nhiều. Có cách nào để làm điều này hoàn toàn trong regex, vì điều này sẽ làm cho toàn bộ quá trình thanh lịch hơn. Bất kỳ trợ giúp sẽ được đánh giá cao.

+0

gì về chỉ làm điều này đầu tiên? 'input.replace (/ \ bMath \ ./ g, '')' Sau đó, làm regex thêm nó. –

+0

Điều gì sẽ xảy ra nếu người dùng đi cùng các loại tự do trong một thứ không có trong danh sách của bạn? Đây là một cách rất xấu để cho phép người dùng nhập công thức của họ. Trừ khi bạn hoàn toàn phân tích mọi ký tự cuối cùng cho tính hợp lệ, tôi sẽ không làm điều này. Nếu bạn lười biếng, hãy tạo danh sách thả xuống các chức năng và hoặc các hoạt động mà họ có thể chọn. – sln

+0

Điều đó chắc chắn sẽ hoạt động, nhưng nó sẽ không được rất thanh lịch, có vẻ như sạch hơn để làm điều đó tất cả trong một dòng. Câu trả lời được đưa ra thực hiện chính xác những gì tôi muốn một cách rất rõ ràng. – Pavlin

Trả lời

7

Bạn có thể sử dụng thủ thuật sau để nó được thay thế ngay cả khi nó phù hợp hay không:

(?:Math\.)?(log2|log|exp|abs|pow) 

Và thay thế với Math.$1

Xem DEMO

+0

Cảm ơn bạn rất nhiều, điều này hoạt động hoàn hảo. – Pavlin

+0

Rất vui được trợ giúp :) –

Các vấn đề liên quan