2012-04-09 32 views
5

Trong chuỗi đầu vào sau:Hướng dẫn Regular Expression cần thiết cho Javascript

{$foo}foo bar \\{$blah1}oh{$blah2} even more{$blah3} but not{$blarg}{$why_not_me} 

Tôi cố gắng để phù hợp với tất cả các trường của {$SOMETHING_HERE} không được bắt đầu bằng một dấu chéo ngược được thoát.

Ví dụ:

Tôi muốn nó để phù hợp với {$SOMETHING} nhưng không \{$SOMETHING}.

Nhưng tôi muốn nó để phù hợp với \\{$SOMETHING}

Nỗ lực:

Tất cả những nỗ lực của tôi cho đến nay sẽ phù hợp với những gì tôi muốn trừ thẻ ngay bên cạnh nhau như {$SOMETHING}{$SOMETHING_ELSE}

đây là những gì tôi hiện có:

var input = '{$foo}foo bar \\{$blah1}oh{$blah2} even more{$blah3} but not{$blarg}{$why_not_me}'; 
var results = input.match(/(?:[^\\]|^)\{\$[a-zA-Z_][a-zA-Z0-9_]*\}/g); 
console.log(results); 

Kết quả đầu ra:

["{$foo}", "h{$blah2}", "e{$blah3}", "t{$blarg}"] 

Goal

Tôi muốn nó được:

["{$foo}", "{$blah2}", "{$blah3}", "{$blarg}", "{$why_not_me}"] 

Câu hỏi

Ai có thể chỉ cho tôi đi đúng hướng?

Trả lời

1

Vấn đề ở đây là bạn cần một lookbehind, mà JavaScript regexs không hỗ trợ

về cơ bản bạn cần "$ {} bất cứ điều gì nếu nó được đi trước bởi một dấu gạch chéo đôi nhưng không phải là một dấu gạch chéo đơn" đó là những gì lookbehind có.

Bạn có thể bắt chước các trường hợp tra cứu đơn giản, nhưng không chắc liệu nó có giúp ích trong ví dụ này hay không. Cung cấp cho nó một đi: http://blog.stevenlevithan.com/archives/mimic-lookbehind-javascript

chỉnh sửa Btw, tôi không nghĩ rằng bạn có thể làm điều này một 'cách ngu ngốc' hoặc vì nếu bạn có [^\\]\{ bạn sẽ phù hợp với bất kỳ ký tự đó không phải là một dấu chéo ngược trước khi cú đúp . Bạn thực sự cần sự trông coi để làm điều này một cách rõ ràng.

Nếu không, bạn có thể làm

(\\*{\$[a-zA-Z_][a-zA-Z0-9_]*\}) 

Sau đó chỉ cần đếm số backslashes trong thẻ kết quả.

+0

Tôi nhận thức được cái nhìn phía sau là những gì tôi cần và javascript không hỗ trợ chúng. Tôi chưa bao giờ thực hiện giả mạo trước đây nhưng tôi sẽ kiểm tra liên kết! – nathanjosiah

+0

@nathanjosiah tôi đã cập nhật câu trả lời của mình với nhiều thông tin hơn. – Griffin

+0

Cảm ơn bài viết! Đúng thứ tôi cần! Tôi đã đăng giải pháp của mình làm câu trả lời. – nathanjosiah

0

này vẻ làm điều tôi muốn:

var input = '{$foo}foo bar \\{$blah1}oh{$blah2} even more\\\\{$blah3} but not{$blarg}{$why_not_me}'; 

var results = []; 
input.replace(/(\\*)\{\$[a-z_][a-z0-9_]*\}/g, function($0,$1){ 
    $0 = $0.replace(/^\\\\/g,''); 
    var result = ($0.indexOf('\\') === 0 ? false : $0); 

    if(result) { 
     results.push(result); 
    } 
}) 

console.log(results); 

Mà cho:

["{$foo}", "{$blah2}", "{$blah3}", "{$blarg}", "{$why_not_me}"] 
1

Khi vẫn thất bại, chia, nối/thay thế các crap ra khỏi nó.

Lưu ý: phần tách/tham gia đầu tiên thực sự là phần dọn dẹp. Điều đó giết chết \ {< *>}

Ngoài ra, tôi không tính đến nội dung bên trong dấu ngoặc vì đã có mã cho nó.

var input = '{$foo}foo bar \\{$blah1}oh{$blah2} even more\\\\{$blah3} but not{$blarg}{$why_not_me}'; 

input.split(/(?:[^\\])\\\{[^\}]*\}/).join('').replace(/\}[^\{]*\{/g,'},{').split(/,/)); 
Các vấn đề liên quan