2011-06-09 30 views
30

Tôi mới làm quen với Regex và tôi đang cố gắng làm việc với một trong những dự án mới của mình để xem tôi có thể học nó và thêm nó vào danh sách kỹ năng của tôi hay không. Tuy nhiên, tôi đang đánh một rào cản ở đây.Javascript + Regex = Không có gì để lặp lại lỗi?

Tôi đang cố gắng để xem nếu đầu vào của người dùng có ký tự bất hợp pháp trong nó bằng cách sử dụng các .search chức năng như vậy:

if (name.search("[\[\]\?\*\+\|\{\}\\\(\)\@\.\n\r]") != -1) { 
    ... 
} 

Tuy nhiên, khi tôi cố gắng để thực hiện chức năng dòng này được chứa nó, nó ném lỗi sau cho dòng cụ thể đó:

Uncaught SyntaxError: Invalid regular expression: /[[]?*+|{}\()@. 

]/: Nothing to repeat 

Tôi không thể nhìn thấy điều gì sai với mã của mình. ai đó có thể chỉ cho tôi phương hướng đúng không?

Trả lời

50

Bạn cần tăng gấp đôi dấu gạch chéo ngược được sử dụng để thoát khỏi các ký tự đặc biệt biểu thức chính quy. Tuy nhiên, như @Bohemian chỉ ra, hầu hết các dấu gạch chéo ngược đó là không cần thiết. Thật không may, câu trả lời của anh ấy gặp phải vấn đề tương tự như của bạn. Những gì bạn thực sự muốn là:

Dấu gạch chéo ngược đang được giải thích bằng mã đọc chuỗi, thay vì được chuyển đến trình phân tích cú pháp biểu thức chính quy. Bạn muốn:

"[\\[\\]?*+|{}\\\\()@.\n\r]" 

Lưu ý dấu gạch chéo ngược bốn lần. Điều đó chắc chắn là cần thiết. Chuỗi được chuyển đến trình biên dịch biểu thức chính quy sau đó giống hệt với chuỗi của @ Bohemian và hoạt động chính xác.

+3

btw, số thứ tư \ chỉ cần ở một số lang, ví dụ java yes, perl not – Bohemian

2

Thứ nhất, trong một lớp nhân vật [...]nhất ký tự không cần thoát - chúng chỉ là chữ.

Vì vậy, regex của bạn nên là:

"[\[\]?*+|{}\\()@.\n\r]" 

này biên dịch cho tôi.

+0

Có, nó biên dịch nhưng nó không hoạt động chính xác – Icet

+0

@Tôi có làm các câu trả lời khác không phù hợp với bạn không? Nếu không, đầu vào nào là "không hoạt động"? – Bohemian

+0

Ví dụ: +44 làm đầu vào không hoạt động. Giải pháp này hoạt động tốt str.replace (/ [\ - \ [\] \/\ {\} \ (\) \ * \ + \? \. \\\^\ $ \ |]/g, "\\ $ &"); – Icet

4

Building tắt của @Bohemian, tôi nghĩ rằng cách tiếp cận đơn giản nhất là nên chỉ sử dụng một chữ regex, ví dụ:

if (name.search(/[\[\]?*+|{}\\()@.\n\r]/) != -1) { 
    // ... stuff ... 
} 

literals Regex là tốt đẹp bởi vì bạn không cần phải thoát khỏi nhân vật chạy thoát, và một số IDE sẽ làm nổi bật regex không hợp lệ (rất hữu ích cho tôi khi tôi liên tục vặn chúng lên).

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