Regex không phải toán tử


109

Có toán tử NOT trong Regexes không? Giống như trong chuỗi đó:"(2001) (asdf) (dasd1123_asd 21.01.2011 zqge)(dzqge) name (20019)"

Tôi muốn xóa tất cả \([0-9a-zA-z _\.\-:]*\)nhưng không phải là một trong những nơi đó là một năm: (2001).

Vì vậy, những gì các regex nên trở về phải là: (2001) name.

LƯU Ý: một cái gì đó như \((?![\d]){4}[0-9a-zA-z _\.\-:]*\)không hoạt động với tôi ( (20019)bằng cách nào đó cũng phù hợp với ...)


1
Có một chuỗi như trên và tôi muốn regex nó lên, đó là kết quả của regex là: (2001) name.
Sonnenhut

Câu trả lời:


110

Không, không có nhà điều hành không trực tiếp. Ít nhất không phải là cách bạn hy vọng.

Tuy nhiên, bạn có thể sử dụng trang đầu phủ định có độ rộng bằng 0:

\((?!2001)[0-9a-zA-z _\.\-:]*\)

Phần (?!...)có nghĩa là "chỉ khớp nếu văn bản theo sau (do đó: lookahead) không (do đó: phủ định) khớp với điều này. Nhưng nó thực sự không sử dụng các ký tự mà nó khớp (do đó: zero-width).

Thực tế, có 4 tổ hợp lookarounds với 2 trục:

  • lookbehind / lookahead: chỉ định xem các ký tự trước hay sau điểm được xem xét
  • positive / negative: chỉ định các ký tự phải khớp hoặc không khớp.

Cảm ơn bạn?! là những gì tôi đã thấy quá, nhưng dù sao nếu tôi sử dụng \((?![\d]{4})[0-9a-zA-z _\.\-:]+\)vẫn còn (20019)ở trong đó
Sonnenhut

Trong phần chỉnh sửa câu hỏi của bạn, bạn đặt phần nhìn trước {4} bên ngoài và trong nhận xét này, bạn đặt nó vào bên trong : bạn đã thử cái nào? Ngoài ra: nếu bạn muốn (20019)để phù hợp, sau đó bạn phải thêm \) bên lookahead của bạn:\((?![\d]{4}\))[0-9a-zA-z _\.\-:]+\)
Joachim Sauer

Với regex ở trên trong bình luận của bạn, nó hoạt động. Nhưng tôi không hiểu điều đó ... Tôi không hiểu tại sao bạn thoát phần sau \((?![\d]{4} -->\)<--)[0-9a-zA-z _\.\-:]+\)Vậy có một dấu ngoặc không đóng, phải không?
Sonnenhut

Tôi thoát khỏi dấu ngoặc đơn )vì tôi muốn khớp với ký tự theo nghĩa đen) (giống như bạn làm ở đầu và cuối của regex của bạn!). Sau đó, sau khi tôi đối sánh với điều đó, tôi kết thúc tìm kiếm bằng cách sử dụng không thoát ).
Joachim Sauer

Hiểu rồi. Tôi đã hơi bối rối bởi tất cả những nhân vật đó. Cảm ơn bạn.
Sonnenhut

182

Không hoàn toàn, mặc dù nói chung bạn thường có thể sử dụng một số giải pháp thay thế trên một trong các biểu mẫu

  • [^abc], là ký tự theo ký tự không ahoặc bhoặc c,
  • hoặc lookahead tiêu cực: a(?!b), mà là akhông tiếp theob
  • hoặc lookbehind tiêu cực: (?<!a)b, được bkhông preceeded bởia

Yep, tôi nghĩ tiêu cực nhìn đằng sau là b - tài liệu tham khảo (<a?!): Regular-expressions.info/lookaround.html
jankins

8
Nhưng [^abc]không nên có nghĩa là không ahoặc bhoặc c, không phải "không phải là chuỗi abc".
Mưa
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.