2010-12-22 86 views
8

Tôi đang cố gắng tạo một regex chỉ cho phép chữ cái viết hoa hoặc chữ thường và các ký tự của dấu cách, '-', ',' '.', '(', Và ')' . Đây là những gì tôi có cho đến nay nhưng vì một lý do nào đó nó vẫn cho phép tôi nhập sốRegex chỉ cho phép các chữ cái và một số ký tự

^[a-zA-Z -,.()]*$ 

bất kỳ trợ giúp nào sẽ tuyệt vời! Cảm ơn.

+2

Ký tự thoát là mã thông báo regex:.() –

+1

@ Mathias E: Bên trong một nhóm ký tự, bạn không phải thoát khỏi tất cả các thẻ regex. – unholysampler

+0

Đó có phải là biểu thức chính quy mà bạn đang thực sự sử dụng không? – Gumbo

Trả lời

3

Vâng, có sự cố trong đó -, đang được hiểu là một phạm vi, như a-z, cho phép tất cả các ký tự từ dấu cách đến dấu phẩy. Thoát khỏi đó và ít nhất một số lỗi cần được sửa.

^[a-zA-Z \-,.()]*$ 

Nói đúng ra, bạn nên có lẽ cũng thoát khỏi .() cũng vậy, kể từ khi những người có ý nghĩa đặc biệt trong biểu thức thông thường. Công cụ regex Javascript (nơi tôi đang thử nghiệm) dường như giải thích chúng theo nghĩa đen trong ngữ cảnh [], dù sao đi nữa, nhưng nó luôn rõ ràng hơn nhiều.

^[a-zA-Z \-,\.\(\)]*$ 

Tuy nhiên, điều này vẫn không nên cho phép 0-9 chữ số, do đó, mã thực tế của bạn mà sử dụng biểu thức chính quy này có thể có một vấn đề, là tốt.

+0

Không cần phải thoát '.',' (',') 'bên trong lớp nhân vật. Trong các lớp ký tự chỉ có ']' và '\ ‍' cũng như' -' và '^' (cả hai tùy thuộc vào vị trí) đều có ý nghĩa đặc biệt. – Gumbo

+0

@Gumbo: ahh, tất cả các công cụ biểu thức thông thường đều đủ thông minh cho điều đó? Điều cần biết :) – Matchu

+0

Vâng, tôi cho là vậy. – Gumbo

12

- đặc biệt trong lớp nhân vật. Nó được sử dụng để xác định phạm vi như bạn đã thực hiện với a-z.

Để phù hợp với một chữ - bạn cần phải hoặc thoát khỏi nó hoặc đặt nó như vậy mà nó sẽ không hoạt động như phạm vi điều hành:

^[a-zA-Z \-,.()]*$ 
     ^^ escaping \ 

hoặc

^[-a-zA-Z ,.()]*$ 
^placing it at the beginning. 

hoặc

^[a-zA-Z -,.()-]*$ 
      ^placing it at the end. 

và thú vị

^[a-z-A-Z -,.()]*$ 
    ^placing in the middle of two ranges. 

Trong trường hợp thức - là nơi giữa a-zA-Z vì cả hai nhân vật xung quanh - (một trong những mà chúng tôi muốn để điều trị theo nghĩa đen) đó là zA đã tham gia vào phạm vi, các - được xử lý theo nghĩa đen nữa .

Trong tất cả các phương pháp được đề cập, phương pháp thoát được đề xuất vì nó làm cho mã của bạn dễ đọc và dễ hiểu hơn. Bất cứ ai nhìn thấy \ sẽ mong đợi rằng một lối thoát được dự định. Đặt - vào đầu (cuối) sẽ tạo ra các vấn đề nếu sau này bạn thêm một ký tự trước (sau) nó trong lớp ký tự mà không cần thoát khỏi - do đó tạo thành một dải.

+0

:/Là một người đọc biểu thức chính quy, tôi thích lối thoát xa hơn. Chỉ cần nhìn vào ba câu trả lời còn lại, tôi có nhiều khả năng nghĩ rằng đây là lỗi đánh máy hơn là sử dụng cố ý hành vi tối nghĩa. – Matchu

+0

@Matchu: Đồng ý với bạn. Tôi đã cập nhật bài đăng của mình. – codaddict

+0

+1 để có câu trả lời tốt và chi tiết như vậy. – suryakiran

2

 -, trong [a-zA-Z -,.()] mô tả phạm vi từ   (0x20) đến , (0x2C). Và đó là tương đương với [ !"#$%'()*+,]. Bạn nên thoát khỏi - hoặc đặt nó ở một nơi khác, nơi nó không được hiểu là chỉ báo phạm vi.

Nhưng đó không phải là nguyên nhân của vấn đề này vì các chữ số từ 0x30 đến 0x39.

0

Tôi đã thử với javascript và hoạt động tốt. Những người khác là chính xác, mặc dù. Nếu trong javascript, kiểm tra xem mọi thứ có hoạt động tốt hay không thì kiểm tra sẽ không xảy ra chút nào.

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