2012-12-17 45 views
5

Làm cách nào để mở rộng đã có mặt của Regex với thuộc tính cho biết rằng regex không thể vượt quá độ dài tối đa (giả sử) 255?Thêm "Độ dài tối đa" vào Regex

Tôi đã có regex sau:

([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)

Tôi đã thử nó như thế, nhưng thất bại:

{.,255([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)}

+1

Kiểm tra chiều dài của kết quả phù hợp? – Cameron

+0

'{., 255}' Sau biểu thức. –

Trả lời

10

Cách tốt nhất để làm điều này, nếu nó phải là một giải pháp dựa trên regex duy nhất, sẽ là sử dụng các giải pháp thay thế.

Xem ví dụ này: http://regex101.com/r/yM3vL0

Những gì tôi đang làm gì ở đây chỉ là phù hợp với chuỗi có nhiều nhất ba ký tự. Cấp, cho ví dụ của tôi, đây không phải là cách tốt nhất để làm điều đó. Nhưng bỏ qua điều đó, tôi chỉ đang cố gắng trình bày một ví dụ phù hợp với bạn.

Bạn cũng phải neo mẫu của bạn, nếu không động cơ sẽ chỉ cần bỏ qua các lookaround (tôi phải giải thích điều này trong chiều sâu?)

Nói cách khác, bạn có thể sử dụng sau trong biểu thức chính quy để hạn chế tối đa 255 ký tự:

^(?!^.{256})([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?) 

Tôi cũng cảm thấy nhiệm vụ của mình là cho bạn biết biểu hiện chính quy của bạn xấu và bạn sẽ cảm thấy xấu.

+0

+1, bạn hoàn toàn đúng, tất nhiên. Tôi đã xóa hoàn toàn regex.Nhưng tuy nhiên bài viết của bạn đã giúp tôi hiểu rõ hơn về regex :) Cảm ơn vì điều đó! – SeToY

+1

Không sao cả! Hãy xem bài kiểm tra trên http://www.regex101.com/quiz/ nếu bạn muốn hiểu các regex thậm chí còn tốt hơn :) –

+0

@Lindrian cảm ơn vì liên kết. –

0

Một regex là không thực sự thực hiện để giải quyết tất cả các vấn đề. Trong trường hợp này, tôi đề nghị rằng thử nghiệm một chiều dài 255 sẽ tốn kém bởi vì nó sẽ yêu cầu 255 trạng thái trong biểu diễn bên dưới. Thay vào đó, chỉ cần kiểm tra chiều dài của chuỗi riêng biệt.

Nhưng nếu bạn thực sự phải, bạn sẽ cần phải thực hiện nhân vật của bạn không bắt buộc, vì vậy cái gì đó như:

.?{255} 

sẽ phù hợp với bất kỳ chuỗi 255 ký tự.

+0

Nhưng sẽ cho phép bất kỳ ai đặt 255 ký tự ngẫu nhiên trước địa chỉ email của bạn !!! – jessehouwing

1

Tại sao không chỉ kiểm tra Độ dài tối đa của chuỗi? Nếu bạn đang sử dụng DataAnnotations, bạn có thể dính [StringLength (255)] vào thuộc tính.

Nếu bạn đang sử dụng Trình xác thực ASP.NET, bạn có thể sử dụng một trình RangeValidator.

Nếu bạn đang sử dụng hàm xác thực tùy chỉnh, bạn có thể đọc được nhiều hơn (và nhanh hơn) để kiểm tra độ dài trước khi bạn ném một regex phức tạp vào nó.

0

Bạn "có thể" có thể sử dụng một cái nhìn về phía trước như sau:

^(?=.{0,255}$)your regex here$ 

Vậy ...

^(?=^.{0,255}$)([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$ 
Các vấn đề liên quan