Regex bukan operator

113

Apakah ada operator NOT di Regexes? Seperti di string itu:"(2001) (asdf) (dasd1123_asd 21.01.2011 zqge)(dzqge) name (20019)"

Saya ingin menghapus semua \([0-9a-zA-z _\.\-:]*\)tapi tidak satu di mana itu adalah satu tahun: (2001).

Jadi apa regex harus kembali harus: (2001) name.

CATATAN: sesuatu seperti \((?![\d]){4}[0-9a-zA-z _\.\-:]*\)tidak bekerja untuk saya ( (20019)entah bagaimana juga cocok ...)

Sonnenhut
sumber
1
Ada String seperti di atas dan saya ingin regex itu, bahwa hasil dari regex adalah: (2001) name.
Sonnenhut

Jawaban:

114

Tidak, tidak ada operator langsung. Setidaknya bukan seperti yang Anda harapkan.

Anda dapat menggunakan tampilan negatif dengan lebar nol, namun:

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

Bagian itu (?!...)berarti "hanya cocok jika teks berikut (karenanya: lookahead) ini tidak (maka: negatif) cocok dengan ini. Tapi itu tidak benar-benar mengkonsumsi karakter yang cocok (karenanya: lebar-nol).

Sebenarnya ada 4 kombinasi lookarounds dengan 2 sumbu:

  • lookbehind / lookahead: menentukan apakah karakter sebelum atau sesudah titik dipertimbangkan
  • positif / negatif: menentukan apakah karakter harus cocok atau tidak boleh cocok.
Joachim Sauer
sumber
Terima kasih?! adalah apa yang saya sarankan juga, tetapi bagaimanapun jika saya menggunakan \((?![\d]{4})[0-9a-zA-z _\.\-:]+\)masih ada (20019)di dalamnya
Sonnenhut
Dalam edit pertanyaan Anda, Anda meletakkan bagian {4} luar lookahead dan dalam komentar ini Anda meletakkannya di dalam : mana yang Anda coba? Juga: jika Anda ingin (20019)mencocokkan, maka Anda harus menambahkan bagian \) dalam lookahead Anda:\((?![\d]{4}\))[0-9a-zA-z _\.\-:]+\)
Joachim Sauer
Dengan ekspresi reguler di atas dalam komentar Anda, ini berfungsi. Tapi saya tidak mengerti itu ... Saya tidak mengerti mengapa Anda lolos dari bagian berikut \((?![\d]{4} -->\)<--)[0-9a-zA-z _\.\-:]+\)Lalu ada braket tidak tertutup, bukan?
Sonnenhut
Saya menghindari tanda kurung penutup )karena saya ingin mencocokkan karakter literal) (seperti yang Anda lakukan di awal dan akhir ekspresi reguler!). Kemudian setelah saya mencocokkan itu, saya mengakhiri lookahead dengan menggunakan unescaped ).
Joachim Sauer
Mengerti. Saya sedikit bingung dengan semua karakter itu. Terima kasih.
Sonnenhut
188

Kurang tepat, meskipun secara umum Anda biasanya dapat menggunakan beberapa solusi untuk salah satu formulir

  • [^abc], yang karakter demi karakter bukan aatau batau c,
  • atau pandangan negatif:, a(?!b)yang atidak diikuti olehb
  • atau tampilan negatif di belakang:, (?<!a)byang btidak didahului oleha
Johan Sjöberg
sumber
Ya, menurut saya pandangan ke belakang negatif adalah (? <! A) b - referensi: regular-expressions.info/lookaround.html
jankins
9
Tapi [^abc]seharusnya berarti bukan aatau batau c, bukan "bukan string abc".
Hujan