Giải pháp tốt nhất đã được đề cập:
somefile_(?!16\.txt$).*\.txt
này hoạt động, và đủ tham lam để có bất cứ điều gì đến lúc nó trên cùng một dòng. Nếu bạn đã biết, tuy nhiên, bạn muốn có một tên hồ sơ hợp lệ, tôi muốn đề nghị cũng giới hạn ký tự không hợp lệ:
somefile_(?!16)[^?%*:|"<>]*\.txt
Nếu bạn đang làm việc với một động cơ regex mà không hỗ trợ lookahead, bạn sẽ phải xem xét làm thế nào để tạo nên điều đó! Bạn có thể chia file thành hai nhóm, những người bắt đầu bằng 1, và không được thực hiện bởi 6, và những người bắt đầu với bất cứ điều gì khác:
somefile_(1[^6]|[^1]).*\.txt
Nếu bạn muốn cho phép somefile_16_stuff.txt nhưng KHÔNG somefile_16.txt , những regex ở trên là không đủ. Bạn sẽ cần phải thiết lập giới hạn của bạn khác nhau:
somefile_(16.|1[^6]|[^1]).*\.txt
Kết hợp tất cả điều này, và bạn kết thúc với hai khả năng, một trong đó khối các trường hợp duy nhất (somefile_16.txt), và một trong đó khối ra tất cả các gia đình (somefile_16 * .txt). Cá nhân tôi nghĩ rằng bạn thích cái đầu tiên:
somefile_((16[^?%*:|"<>]|1[^6?%*:|"<>]|[^1?%*:|"<>])[^?%*:|"<>]*|1)\.txt
somefile_((1[^6?%*:|"<>]|[^1?%*:|"<>])[^?%*:|"<>]*|1)\.txt
Trong phiên bản mà không xoá các ký tự đặc biệt vì vậy nó dễ dàng hơn để đọc:
somefile_((16.|1[^6]|[^1).*|1)\.txt
somefile_((1[^6]|[^1]).*|1)\.txt
Nguồn
2008-11-24 16:36:38
Bạn có thể muốn? trong đó như thế này: somefile (?! 16). *? \. txt –
@Martin Brown: Tại sao? . *? afaik không hợp lệ ở hầu hết các phương ngữ. . có nghĩa là bất kỳ ký tự nào, * không hoặc nhiều lần xuất hiện. Dấu chấm hỏi nên làm gì? – phihag
@phihag:. *? có nghĩa là để làm cho. * không tham lam. Đó là cách sử dụng đặc biệt của dấu chấm hỏi. –