2010-08-19 26 views
6

Tôi cần phải kiểm tra xem chuỗi có tuân thủ định dạng ID cụ thể hay không.Tôi có thể rút ngắn biểu thức chính quy này không?

Định dạng của ID là như sau:

aBcDe-fghIj-KLmno-pQRsT-uVWxy

Một chuỗi các năm dãy năm chữ cái chữ hoa hoặc chữ thường, cách nhau bằng một dấu gạch ngang.

Tôi có biểu hiện thường xuyên sau đó hoạt động:

string idFormat = "[a-zA-Z]{5}[-]{1}[a-zA-Z]{5}[-]{1}[a-zA-Z]{5}[-]{1}[a-zA-Z]{5}[-]{1}[a-zA-Z]{5}"; 

Lưu ý rằng không có dấu gạch ngang đuôi, nhưng tất cả các khối trong ID theo các định dạng tương tự. Do đó, tôi muốn có thể trình bày chuỗi bốn khối này với dấu gạch ngang bên trong biểu thức chính quy và tránh trùng lặp.

Tôi đã thử các sau đây, nhưng nó không hoạt động:

string idFormat = "[[a-zA-Z]{5}[-]{1}]{4}[a-zA-Z]{5}"; 

Làm thế nào để rút ngắn thời biểu thức chính quy này và thoát khỏi những phần nhân đôi?

Cách tốt nhất để đảm bảo rằng mỗi khối cũng không chứa bất kỳ số nào?


Edit:

Cảm ơn đã trả lời, bây giờ tôi hiểu được nhóm trong biểu thức thông thường.

Tôi đang chạy một vài thử nghiệm chống lại các biểu hiện thường xuyên, sau đây là có liên quan:

Test 1: aBcDe-fghIj-KLmno-pQRsT-uVWxy
thử nghiệm 2: abcde-fghij-klmno-pqrst-uvwxy

Với biểu thức chính quy sau, cả hai bài kiểm tra qua:

^([a-zA-Z]{5}-){4}[a-zA-Z]{5}$ 

với sự biểu hiện thường xuyên tới, kiểm tra 1 thất bại:

^([a-z]{5}-){4}[a-z]{5}$ 

Một số câu trả lời đã nói rằng bạn có thể bỏ qua A-Z khi sử dụng a-z, nhưng trong trường hợp này dường như nó không hoạt động.

Trả lời

6

Nếu bạn có thể đặt tùy chọn regex không phân biệt chữ hoa chữ thường, bạn có thể thay thế tất cả [a-zA-Z] chỉ bằng đồng bằng [a-z]. Ngoài ra, [-]{1} có thể được viết là -.

nhóm của bạn nên được thực hiện với (, ), không phải với [, ] (mặc dù bạn đang sử dụng một cách chính xác sau này quy định cụ thể các bộ ký tự.

Tùy thuộc vào ngữ cảnh, bạn có thể muốn ném vào ^...$ mà phù hợp bắt đầu và kết thúc của chuỗi, tương ứng, để xác minh rằng toàn bộ chuỗi là một trận đấu (tức là không có nhân vật phụ)

trong javascript, một cái gì đó như thế này:.

/^([a-z]{5}-){4}[a-z]{5}$/i 
+0

Vui lòng kiểm tra bài đăng đã chỉnh sửa, tôi gặp sự cố khi nhận regex chỉ hoạt động với a-z ngược với a-zA-Z – fletcher

+2

@fletcher: bạn cần * chỉ định * rằng regex phải phân biệt chữ hoa chữ thường. làm thế nào bạn làm điều đó phụ thuộc vào ngôn ngữ bạn đang làm điều này trong javascript, nó là với 'i' như trong ví dụ của tôi, trong C# nó là 'mới Regex (mô hình, RegexOptions.IgnoreCase);' Cũng có trường hợp nơi bạn * không thể * làm cho nó không phân biệt chữ hoa chữ thường, chẳng hạn như các điều khiển của ASP.NET RegexValidator, không hỗ trợ RegexOptions và có thể một số ngôn ngữ lập trình có thể không hỗ trợ nó. –

+0

Sự cố được giải quyết. Cảm ơn David – fletcher

7

Bạn có thể thử:

([a-z]{5}-){4}[a-z]{5} 

và làm cho nó phân biệt dạng chữ.

+0

Tốt, tôi không nghĩ về trường hợp không nhạy cảm. – Benjol

+0

Đảm bảo bạn thực hiện '^ $' ở đầu/cuối nếu không, giá trị này sẽ khớp với '1651651aBcDe-fghIj-KLmno-pQRsT-uVWxy1625361 $% 4g $%^£ $ 48';) –

0

Hãy thử

string idFormat = "([a-zA-Z]{5}[-]{1}){4}[a-zA-Z]{5}"; 

Tức là về cơ bản bạn thay thế dấu ngoặc đơn bằng dấu ngoặc đơn. Chân đế không có nghĩa là để nhóm nhưng để xác định một lớp nhân vật được chấp nhận.

Tuy nhiên, lưu ý rằng với các phiên bản rút gọn, bạn có thể sử dụng biểu thức để xác thực chuỗi, nhưng không phải để phân tích.Nếu bạn muốn xử lý 5 nhóm ký tự, bạn sẽ muốn đặt chúng trong 5 nhóm:

string idFormat = 
    "([a-zA-Z]{5})-([a-zA-Z]{5})-([a-zA-Z]{5})-([a-zA-Z]{5})-([a-zA-Z]{5})"; 

để bạn có thể xử lý từng nhóm và xử lý nhóm.

+0

Không có cách nào, nó chỉ là hoán đổi hình vuông dấu ngoặc đơn cho dấu ngoặc đơn? – fletcher

1

này làm việc cho tôi, mặc dù bạn có thể muốn kiểm tra xem nó:

[a-zA-Z]{5}(-[a-zA-Z]{5}){4} 

(Một nhóm năm chữ, tiếp theo là [dấu gạch ngang + nhóm năm chữ] bốn lần)

0
([a-zA-Z]{5}[-]{1}){4}[a-zA-Z]{5} 
Các vấn đề liên quan