2011-09-06 34 views
44

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)"Nhà điều hành không phải Regex

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

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

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

+0

Tôi không chắc chắn tôi hiểu những gì bạn muốn khớp (hoặc tại sao bạn đặt tất cả những parens xung quanh văn bản thuần túy) – Mat

+1

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

Trả lời

51

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

Bạn có thể sử dụng một lookahead tiêu cực zero-chiều rộng, tuy nhiên:

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

Phần (?!...) có nghĩa là "chỉ phù hợp nếu văn bản sau (do đó: lookahead) này không (do đó: tiêu cực) phù hợp với điều này.Nhưng nó không thực sự tiêu thụ các ký tự phù hợp (do đó: không chiều rộng).

Thực sự có 4 kết hợp của lookarounds với 2 trục:

  • lookbehind/lookahead: xác định nếu các nhân vật trước hoặc sau điểm được coi là
  • tích cực/tiêu cực: xác định nếu các nhân vật phải trận đấu hoặc phải không trận đấu.
+0

Cảm ơn bạn?! là những gì tôi đã đề xuất 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

+0

Trong phần chỉnh sửa câu hỏi của bạn, bạn đặt' {4} '* bên ngoài * phần chú thích và trong chú thích này bạn đặt nó * bên trong *: bạn đã thử cái nào? Ngoài ra: nếu bạn muốn '(20019)' khớp, thì bạn phải thêm '\)' * bên trong * dấu nhìn của bạn: '\ ((?! [\ D] {4} \)) [0-9a-zA -z _ \. \ -:] + \) ' –

+0

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 khỏi phần sau ''\ ((?! [\ D] {4} -> \) <-) [0-9a-zA -z _ \. \ -:] + \) '' Sau đó có một khung không đóng, phải không? – Sonnenhut

88

Không hẳn, mặc dù nói chung, bạn thường có thể sử dụng một số cách giải quyết trên một trong những hình thức

  • [^abc], đó là bất cứ điều gì nhưng abc,
  • hoặc lookahead tiêu cực: a(?!b), đó là a không tiếp theo b
  • hoặc lookbehind tiêu cực: (?<!a)b, được b không preceeded bởi a
+0

Yep, tôi nghĩ rằng tiêu cực nhìn phía sau là (? jankins