Bạn đang nghĩ về nó đúng cách. Nhưng tiếc là lookbehinds thường có độ dài cố định. Ngoại lệ chính duy nhất là động cơ regex của .NET, cho phép định lượng lặp lại bên trong lookbehinds. Nhưng vì bạn chỉ cần một cái nhìn tiêu cực và không phải là một lookahead, quá. Có một hack cho bạn. Đảo ngược chuỗi, sau đó cố gắng đối sánh:
/rab(?!.{0,10}oof)/
Sau đó đảo ngược kết quả của trận đấu hoặc trừ vị trí phù hợp khỏi độ dài của chuỗi, nếu đó là những gì bạn đang theo dõi.
Bây giờ từ regex bạn đã đưa ra, tôi cho rằng đây chỉ là một phiên bản đơn giản của những gì bạn thực sự cần. Tất nhiên, nếu bar
là một mô hình phức tạp, một số suy nghĩ nhiều hơn cần phải đi vào làm thế nào để đảo ngược nó một cách chính xác.
Lưu ý rằng nếu mẫu của bạn yêu cầu cả lookbehinds biến đổi và lookaheads, bạn sẽ có một thời gian khó giải quyết này. Ngoài ra, trong trường hợp của bạn, nó sẽ có thể để mổ xẻ lookbehind của bạn thành nhiều những độ dài thay đổi (vì bạn sử dụng không +
cũng không *
):
/(?<!foo)(?<!foo.)(?<!foo.{2})(?<!foo.{3})(?<!foo.{4})(?<!foo.{5})(?<!foo.{6})(?<!foo.{7})(?<!foo.{8})(?<!foo.{9})(?<!foo.{10})bar/
Nhưng đó không phải là tất cả những gì tốt đẹp, phải không?
Nguồn
2012-11-30 19:23:35
Đảo ngược chuỗi là một ý tưởng thú vị. Cảm ơn! –