2009-01-28 32 views
42

thể trùng lặp:
Escape string for use in Javascript regexqua biến một regexp trong javascript

Tôi có một msg như thế này:

Max {0} ký tự cho phép trong { 1}

Và tôi có một chức năng để tạo ra một thông điệp bằng đối số được truyền như

for(var i = 0; i < agrs.length; i++){ 
    reg = new RegExp('\{'+i+'\}', 'gi'); 
    key = key.replace(reg,agrs[i]) 
} 

Vấn đề là nó không thể lấy param i để tạo ra exp reg.

Cách để đạt được điều này là gì?

+2

@casperOne, trùng lặp là gì? Cả [câu hỏi này] (http://stackoverflow.com/questions/4029109/javascript-regex-how-to-put-a-variable-inside-a-regular-expression) cũng không phải [câu hỏi này] (http: // stackoverflow.com/questions/494035/how-do-you-pass-a-variable-to-a-regular-expression-javascript) giống như câu hỏi này. Câu hỏi này rất quan trọng vì nó cho thấy thực sự trộn một biến chuỗi thành một mẫu regex, trong khi câu trả lời của các câu hỏi khác chỉ cung cấp các ví dụ trong đó các ký tự thoát không phải là một vấn đề. – MandM

Trả lời

52

Regexp của bạn là /{0}/gi vì bạn tạo nó từ một chuỗi. Và nó không phải là một biểu thức hợp lệ. Bạn cần phải thoát khỏi {trong regexp bởi vì nó có một ý nghĩa đặc biệt trong cú pháp regexp, vì vậy nó cần được:

new RegExp('\\{'+i+'\\}', 'gi'); 

đó là /\\{0\\}/gi. Bạn cần phải thoát thoát khi thoát \\ trong chuỗi.

+0

hoạt động như gió mát. Cảm ơn. – Nrj

3

Tôi nghĩ rằng dòng thứ hai của bạn được coi là

reg = new RegExp('\{'+i+'\}', 'gi'); 

nhưng tôi không biết nếu đó là vấn đề duy nhất của bạn hay không.

+0

Đúng là như vậy, nhưng nó không cho phép tạo ra nó. Nói "số lượng không hợp lệ". – Nrj

6

Tôi thực sự khuyến khích bạn sử dụng dạng chức năng String.replace() để giải quyết vấn đề của bạn, thay vì cố gắng parametrize regexp trong vòng lặp lặp lại trên {0}, {1}, v.v.

Nói cách khác, thay vì tìm kiếm '{0}' hoặc '{1}', chỉ cần tìm '{([0-9] +)}' (tức là {} xung quanh một số tùy ý, và chuyển một hàm vào hàm replace() để thay thế các biểu thức này một cách thông minh dựa trên số giữa các ký tự {}. Điều này cho phép bạn sử dụng một ký tự RegExp mà bạn có thể viết là/{([0-9] +)}/. chứ không lộn xộn xung quanh với các nhân vật thoát trong chuỗi

Something như thế này:

s='the song says {0} little {1} little {2} little-endians'; 
args=['zero','one','two']; 
new_string = s.replace(/{([0-9]+)}/g, function(wholematch,firstmatch) 
    {return args[(+firstmatch)]; } 
); 

trong đó sản lượng

the song says zero little one little two little-endians 

Xem điều này similar question.

chỉnh sửa: nếu bạn muốn để lại các mặt hàng mình có lớn hơn chiều dài của danh sách args của bạn, hãy chắc chắn để sanity-kiểm tra số tham số:

s='the song says {0} little {1} little {2} little-endians,\n'+ 
    ' {3} little {4} little {5} little-endians'; 
args=['zero','one','two']; 
new_string = s.replace(/{([0-9]+)}/g, function(wholematch,firstmatch) 
    {var i = +firstmatch; return i < args.length ? args[i] : wholematch;} 
); 

trong đó sản lượng

the song says zero little one little two little-endians, 
{3} little {4} little {5} little-endians 
Các vấn đề liên quan