2010-12-11 40 views
12
chuỗi

Ví dụ: $${a},{s$${d}$$}$$hợp đệ quy với biểu thức thông thường trong Javascript

Tôi muốn để phù hợp với $${d}$$ đầu tiên và thay thế nó một số văn bản để chuỗi sẽ trở thành $${a},{sd}$$, sau đó $${a},{sd}$$ sẽ được xuất hiện.

+2

Không thể bạn chỉ cần sử dụng hai biểu thức thông thường riêng biệt? Trận đấu # 1 đầu tiên, thay thế, và sau đó cố gắng để phù hợp với # 2? – Pandincus

+0

@Pandincus: Điều đó sẽ không cho phép làm tổ, nếu không thì có. – Orbling

Trả lời

21

Khó chịu, Javascript không cung cấp tham số đệ quy PCRE (?R), vì vậy, việc giải quyết vấn đề lồng nhau là rất dễ dàng. Nó có thể được thực hiện tuy nhiên.

Tôi sẽ không tạo lại mã, nhưng nếu bạn xem Steve Levithan's blog, anh ấy có một số bài viết hay về chủ đề này. Anh ta nên làm, anh ta có lẽ là cơ quan hàng đầu về RegExp trong JS. Ông đã viết XRegExp, thay thế hầu hết các bit PCRE bị thiếu, thậm chí còn có một plugin Match Recursive!

+1

+1 các liên kết rất hữu ích – bowsersenior

+0

Tôi sẽ không nói rằng XRegExp thay thế 'hầu hết các phần bị thiếu', nhưng nó không hỗ trợ. Tuy nhiên, đối với các regex thực sự, bạn cần hỗ trợ đầy đủ thuộc tính và grapheme. Hiện nay, hơn 80% trang web là Unicode và đó là tội mà bạn không thể đối phó với nó trong trình duyệt. – tchrist

+0

@tchrist: Thế giới nói tiếng Anh hầu như không sử dụng nó, do đó, nó không quan trọng đối với những người có thể thay đổi nó. Điều đó được bổ sung vào nguyên tắc thay đổi không thể xảy ra chậm ở cấp độ cơ bản của trang web khiến những thứ như vậy vẫn là một lối tắt. Vô tình để nói rằng ít nhất. – Orbling

0

Nói chung, Regexps không phù hợp với loại vấn đề đó. Nó tốt hơn để sử dụng máy nhà nước.

+0

Trình phân tích cú pháp có lẽ? – Orbling

+0

@Orbling: http://pegjs.majda.cz/ Điều này có vẻ thú vị :-P – Pandincus

+0

@Pandincus: Nice, yacc cho JS. :-) – Orbling

1

Vì bạn muốn thực hiện điều này một cách đệ quy, có lẽ bạn nên thực hiện nhiều kết quả phù hợp bằng cách sử dụng vòng lặp.

Chính Regex không phù hợp cho bất kỳ thứ gì đệ quy.

0

tôi đã viết này bản thân mình:

String.prototype.replacerec = function (pattern, what) { 
    var newstr = this.replace(pattern, what); 
    if (newstr == this) 
     return newstr; 
    return newstr.replace(pattern, what); 
}; 

Cách sử dụng:

"My text".replacerec(/pattern/g,"what"); 
+1

Tôi đã sử dụng nó trong một mã sản xuất chạy trong hơn một năm. Đó là một cơ hội hiếm có mà một regex tiếp tục phù hợp với thời gian vô hạn. Vì vậy, không có tràn! Và đó là một cách nhanh chóng để đệ quy thay thế trực tiếp từ mã JavaScript. –

+0

Giới hạn của ngăn xếp không phải là vô hạn. IE6 chỉ có thể xử lý 1130 cuộc gọi. Đó không phải là 1130 regexp phù hợp, đó là tổng số trận đấu regexp cộng với bất cứ điều gì khác mà bạn đã xảy ra. Nói rằng đây là một câu trả lời đủ tốt là không chính xác bởi vì ai đó có thể đang sử dụng nó trong một môi trường chuyên sâu đã có chức năng, và cái gì đó không nên thêm vào ngăn xếp có thể đẩy nó tràn. -1. – lededje

0
var content = "your string content"; 
var found = true; 
while (found) { 
    found = false; 
    content = content.replace(/regex/,() => { found = true; return "new value"; }); 
} 
+0

Mặc dù các khái niệm có lẽ ở đó, có quá nhiều thứ sẽ không hoạt động, có thể rất sai và không giải quyết được câu hỏi. –

+0

Điều gì có thể xảy ra? Mẫu đơn giản này có thể giải quyết vấn đề trong câu hỏi với định nghĩa đúng regex. –

+0

Nó không có dự phòng, vì vậy nếu nó không phù hợp, nó có thể sẽ vượt quá phụ cấp bộ nhớ. Ngoài ra "giá trị mới" là gì và nó nên đến từ đâu? Và bạn không thể hiện được cách thức mà regex của OP thực sự có thể làm việc trong mã này. –

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