2012-12-19 36 views
26

Tôi đang cố gắng xác thực một chuỗi, phải chứa số chữ cái và ký tự đặc biệt chỉ &-._. Đối với điều đó tôi đã cố gắng với một biểu thức chính quy.Kết hợp các ký tự đặc biệt và chữ cái trong regex

var pattern = /[a-zA-Z0-9&_\.-]/ 
var qry = 'abc&*'; 
if(qry.match(pattern)) { 
    alert('valid'); 
} 
else{ 
    alert('invalid'); 
} 

Khi sử dụng mã trên, chuỗi abc&* hợp lệ. Nhưng yêu cầu của tôi là hiển thị điều này không hợp lệ. tức là Bất cứ khi nào một ký tự khác với một chữ cái, một số hoặc các ký tự đặc biệt &-._ xuất hiện, chuỗi nên đánh giá là không hợp lệ. Làm thế nào tôi có thể làm điều đó với một regex?

+4

Điều quan trọng là sử dụng '^' ngay từ đầu và '+ $ 'ở cuối, như những câu trả lời dưới đây đã giải thích. '/^[a-zA-Z0-9 & _ \ .-] + $ /'. Tôi chỉ ra điều này trong trường hợp bạn bỏ lỡ sự khác biệt tinh tế đó. –

Trả lời

42

Thêm họ ký tự được phép, nhưng bạn sẽ cần phải thoát khỏi một số trong số họ, chẳng hạn như -]/\

var pattern = /^[[email protected]#$%^&*()_+\-=\[\]{};':"\\|,.<>\/?]*$/ 

Bằng cách đó bạn có thể loại bỏ bất kỳ ký tự riêng lẻ bạn muốn không cho phép .

Ngoài ra, bạn muốn bao gồm sự khởi đầu và kết thúc của chuỗi placemarkers^và $

Cập nhật:

Như elclanrs hiểu (và phần còn lại của chúng tôi thì không, ban đầu), các chỉ ký tự đặc biệt cần phải được cho phép trong mẫu là & -._

/^[\w&.\-]+$/ 

[\ w] cũng giống như [a-zA-Z0-9_]

Mặc dù dấu gạch ngang không cần thoát khi nó ở đầu hoặc cuối danh sách, tôi muốn làm điều đó trong trường hợp các ký tự khác được thêm vào. Ngoài ra, dấu + có nghĩa là bạn cần ít nhất một trong các ký tự được liệt kê.Nếu không là ok (tức là một giá trị rỗng), sau đó thay thế nó bằng một * thay vì:

/^[\w&.\-]*$/ 
+1

Tôi sẽ đề nghị rằng bất kỳ danh sách nào cho phép tất cả các ký tự đặc biệt đó cũng nên cho phép các khoảng trống. – Abacus

+0

Dấu cộng (+) không hoạt động với cụm từ này – calbertts

+0

@calbertts, ý của bạn là nó được bao gồm trong danh sách các ký tự trong "var pattern ..."? Bạn đang sử dụng ngôn ngữ nào? Javascript? –

16

Vâng, tại sao không chỉ thêm chúng vào lớp nhân vật hiện tại của bạn?

var pattern = /[a-zA-Z0-9&._-]/ 

Nếu bạn cần phải kiểm tra xem một chuỗi gồm gì, nhưng những ký tự mà bạn phải neo biểu thức cũng như:

var pattern = /^[a-zA-Z0-9&._-]+$/ 

Các thêm ^$ trận đấu bắt đầu và kết thúc chuỗi tương ứng.

Testing cho chữ cái, số hoặc gạch có thể được thực hiện với \w mà rút ngắn biểu hiện của bạn:

var pattern = /^[\w&.-]+$/ 

Như đã đề cập trong các bình luận từ Nathan, nếu bạn không sử dụng kết quả từ .match() (nó trả về một mảng với những gì đã được xuất hiện), nó tốt hơn để sử dụng RegExp.test() mà trả về một boolean đơn giản:

if (pattern.test(qry)) { 
    // qry is non-empty and only contains letters, numbers or special characters. 
} 

cập nhật 2

Trong trường hợp tôi đã đọc sai câu hỏi, phần dưới đây sẽ kiểm tra xem có đủ ba điều kiện riêng biệt không.

if (/[a-zA-Z]/.test(qry) && /[0-9]/.test(qry) && /[&._-]/.test(qry)) { 
    // qry contains at least one letter, one number and one special character 
} 
+3

+1. Có thể đáng nói đến việc sử dụng 'test' thay vì' match', vì bạn không thực sự cần các kết quả phù hợp để được tìm thấy. Điều này có thể giúp hiệu suất, khả năng đọc và có thể giúp người hỏi tìm hiểu điều gì đó mới mẻ. –

+1

Ngoài ra, không có dấu gạch chéo sau 'i'. '/ [a-z]/i /' phải là '/ [a-z]/i'. –

9

Hãy thử regex này:

/^[\w&.-]+$/ 

Ngoài ra bạn có thể sử dụng test.

if (pattern.test(qry)) { 
    // valid 
} 
0

Hãy thử RegEx này: Matching charecters đặc biệt mà chúng tôi sử dụng trong đoạn văn và bảng chữ cái

Javascript : /^[a-zA-Z]+(([\'\,\.\-_ \/)(:][a-zA-Z_ ])?[a-zA-Z_ .]*)*$/.test(str) 

       .test(str) returns boolean value if matched true and not matched false 

      c# : ^[a-zA-Z]+(([\'\,\.\-_ \/)(:][a-zA-Z_ ])?[a-zA-Z_ .]*)*$ 
Các vấn đề liên quan