2015-05-20 24 views
6

Tôi đang tạo một regex động.Lỗi cú pháp biểu thức chính quy

var link = "www.google.com"; 
 
    var reg = '^'+link+'{1}|(?<=\s)'+link+'{1}(?=\s)|'+link+'{1}$'; 
 
    console.log(reg); 
 
    var result = new RegExp(reg, 'g');

Tôi nhận được lỗi này

Uncaught SyntaxError: Invalid regular expression: /^www.google.com{1}|(?<=s)www.google.com{1}(?=s)|www.google.com{1}$/: Invalid group 

Dưới đây là regex tạo:

^www.google.com{1}|(?<=s)www.google.com{1}(?=s)|www.google.com{1}$

+0

Bạn có sử dụng một số cú pháp không phải JS không? Ví dụ tôi không nhận ra '? <=' – mplungjan

+0

Tại sao lại bỏ phiếu kín ??? – mplungjan

+0

Nó đảm bảo rằng mẫu nhất định sẽ khớp, kết thúc tại vị trí hiện tại trong biểu thức. Không tiêu thụ bất kỳ ký tự nào. Ví dụ:/(? <= Foo) bar/Khớp: foobar – user3816152

Trả lời

1

JavaScript không hỗ trợ các nhóm lookbehind.

Ngày đầu đó, cụm từ thông dụng của bạn đang được tạo từ chuỗi. Bạn phải đảm bảo rằng metacharacters biểu thức chính quy của bạn "tồn tại" quá trình phân tích chuỗi không đổi, và cụ thể là \s cần được biểu thị là \\s.

Cũng lưu ý rằng các ký tự . trong phần URL của mẫu của bạn sẽ được hiểu là biểu tượng "ký tự đại diện" regex nếu bạn không đứng trước chúng với \\.

Cuối cùng, không rõ bạn mong đợi những gì {1} điều cần làm; trong JavaScript sẽ khớp với chuỗi ký tự {1}.

+1

'{1}' là một định lượng (mặc dù là một số vô dụng). '/^m {1} $ /. test ('m')' trả về 'true' (trong Firefox ít nhất). –

+1

@FelixKling oh durr. Không đủ cà phê chưa :) – Pointy

+0

Đừng lo lắng :) Sẽ không có gì đáng ngạc nhiên với tôi nếu '{1} 'được đối xử khác biệt;) –

5

Công cụ chỉnh sửa JavaScript không hỗ trợ giao diện tại tất cả. Một điều khác: bạn phải tăng gấp đôi thoát \ bên trong hàm tạo RegExp.

Điều bạn đang cố gắng đạt được là làm cho URL khớp với nhau ở các ranh giới từ.

Hãy thử sử dụng

RegExp.escape= function(s) { 
    return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); 
}; 

var reg = '\\b'+RegExp.escape(link)+'\\b'; 

Code:

RegExp.escape= function(s) { 
 
     return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); 
 
    }; 
 

 
var link = "www.google.com" 
 
var reg = '\\b'+RegExp.escape(link)+'\\b'; 
 
alert(new RegExp(reg, "g"));

Note Tôi thêm RegExp.Escape để thoát khỏi nhân vật đặc biệt trong các đối số truyền cho constructor RegExp (ví dụ: . phải là \\.).

+0

là có bất kỳ thay thế cho nhìn phía sau trong javascript ?? – user3816152

+0

i apreciate giúp đỡ của bạn .. Cảm ơn bạn. – user3816152

+0

[Có các lựa chọn thay thế] (http://blog.stevenlevithan.com/archives/mimic-lookbehind-javascript), nhưng không có trường hợp nào trong trường hợp bạn có số ký tự không xác định trước và sau chuỗi bạn muốn khớp. –

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