2011-11-23 34 views

Trả lời

9

Vì bạn đề cập đến nó trong tiêu đề, một lookahead tiêu cực đối với trường hợp của bạn sẽ là:

^(?!.{16,})(regex goes here)+$ 

Lưu ý lookahead tiêu cực vào đầu (?!.{16,}), để kiểm tra rằng chuỗi không có 16 hoặc nhiều ký tự hơn.

Tuy nhiên, như @TimPietzcker đã chỉ ra Regex của bạn có thể được đơn giản hóa rất nhiều và được viết lại dưới dạng không dễ bị backtracking, vì vậy bạn nên sử dụng giải pháp của mình.

+1

Điều này vẫn dễ bị khủng hoảng ngược. Không phải là một regex tốt. –

+0

@TimPietzcker Điểm rất tốt. Trả lời ngay bây giờ được cập nhật, nhờ –

5
^(?=.{15}$)([A-Z]+()*[A-Z]+)+$ 

See it

+0

Điều này cho phép dễ dàng thêm giới hạn độ dài chuỗi tối thiểu –

11

Trên thực tế, tất cả điều này có thể được đơn giản hóa rất nhiều:

^[A-Z][A-Z ]{0,13}[A-Z]$ 

thực hiện chính xác những gì bạn muốn. Hoặc ít nhất là những gì regex hiện tại của bạn làm (cộng với giới hạn độ dài). Điều này đặc biệt tránh được các vấn đề với catastrophic backtrackin g mà bạn đang thiết lập cho mình khi lồng các bộ định lượng như thế.

Trường hợp tại điểm:

Thử chuỗi ABCDEFGHIJKLMNOP so với regex ban đầu của bạn. Động cơ regex sẽ khớp ngay lập tức. Bây giờ hãy thử chuỗi ABCDEFGHIJKLMNOPa. Nó sẽ lấy động cơ regex gần như 230.000 các bước để tìm ra nó không thể khớp với chuỗi. Và mỗi nhân vật bổ sung sẽ tăng gấp đôi số bước cần thiết để xác định một trận đấu không thành công.

+0

Hình của anh ấy giống như nó yêu cầu ít nhất 2 chữ cái, một chữ cái ở đầu, một ở đầu. – sln

+0

Regexp bạn đã đưa ra các kết quả phù hợp "A" và "A", cả hai đều không khớp với regexp của poster. –

+0

Không, điều này sẽ cho phép chuỗi kết thúc bằng khoảng trắng. – AustinTX

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