Saya menggunakan RegexBuddy tetapi saya bermasalah dengan hal ini: \
Saya sedang memproses file baris demi baris. Saya membangun "model garis" agar sesuai dengan yang saya inginkan.
Sekarang saya ingin melakukan pencocokan terbalik ... yaitu saya ingin mencocokkan baris di mana terdapat rangkaian 6 huruf, tetapi hanya jika enam huruf ini bukan Andrea , bagaimana saya harus melakukannya?
EDIT: Saya akan menulis program yang menggunakan regex ini, saya belum tahu apakah di python atau php, saya melakukan hal ini terlebih dahulu untuk mempelajari beberapa regex :) Ada berbagai jenis baris, saya ingin menggunakan regex untuk memilih jenis yang saya minati. Setelah saya mendapatkan baris ini, saya harus menerapkan filter lain hanya agar tidak cocok dengan nilai yang diketahui, saya memerlukan yang lainnya, bukan itu. (?! Tidak diinginkan) bekerja dengan baik, terima kasih. :-)
Saya harap ini menjelaskan pertanyaannya :)
sumber
Jawaban:
Dengan asumsi mesin regexp Anda mendukung lookahead negatif ..
Sunting: ..atau mungkin Anda lebih suka menggunakan
[A-Za-z]{6}
sebagai pengganti.{6}
Edit (lagi): Perhatikan bahwa lookahead dan lookbehind biasanya bukan cara yang tepat untuk "membalik" pencocokan ekspresi reguler. Regexps tidak benar-benar disiapkan untuk melakukan pencocokan negatif, mereka menyerahkannya ke bahasa apa pun yang Anda gunakan.
sumber
Untuk Python / Java,
http://www.lisnichenko.com/articles/javapython-inverse-regex.html
sumber
some text
memulai baris, itu akan mengembalikan hasil yang salah.?!
dan tidak adil!
.Diperbarui dengan umpan balik dari Alan Moore
Di PCRE dan varian serupa, Anda sebenarnya dapat membuat regex yang cocok dengan baris mana pun yang tidak berisi nilai:
Ini disebut token rakus yang marah . Sisi negatifnya adalah kinerjanya tidak baik.
sumber
[\s\S]
, yang hanya berguna dalam JavaScript) setelah lookahead kedua, dan Anda tidak perlu yang pertama:^(?:(?!Andrea).)*$
.[\S\s]
? OP berbicara tentang baris yang cocok, tidak mengandung kata "Andrea". Bukan tentang memeriksa apakah seluruh string mengandung kata ini. Apakah saya melewatkan sesuatu?Bahasa apa yang Anda gunakan? Kemampuan dan sintaks dari implementasi regex penting untuk ini.
Anda bisa menggunakan lihat ke depan. Menggunakan python sebagai contoh
Untuk memecahnya:
(?! Andrea) berarti 'cocok jika 6 karakter berikutnya bukan "Andrea"'; jika demikian maka
\ w berarti "karakter kata" - karakter alfanumerik. Ini setara dengan kelas [a-zA-Z0-9_]
\ w {6} artinya tepat 6 karakter kata.
re.IGNORECASE berarti Anda akan mengecualikan "Andrea", "andrea", "ANDREA" ...
Cara lain adalah dengan menggunakan logika program Anda - gunakan semua baris yang tidak cocok dengan Andrea dan letakkan di regex kedua untuk memeriksa 6 karakter. Atau periksa dulu setidaknya 6 karakter kata, lalu periksa apakah kata itu tidak cocok dengan Andrea.
sumber
Penegasan lookahead negatif
Ini sebenarnya bukan pencocokan terbalik, tetapi ini yang terbaik yang dapat Anda lakukan secara langsung dengan regex. Tidak semua platform mendukungnya.
sumber
Jika Anda ingin melakukan ini di RegexBuddy, ada dua cara untuk mendapatkan daftar semua baris yang tidak cocok dengan regex.
Pada toolbar di panel Test, setel cakupan pengujian ke "Baris demi baris". Ketika Anda melakukan itu, item Daftar Semua Garis tanpa Kecocokan akan muncul di bawah tombol Daftar Semua pada toolbar yang sama. (Jika Anda tidak melihat tombol Daftar Semua, klik tombol Cocokkan di toolbar utama.)
Pada panel GREP, Anda dapat mengaktifkan kotak centang "berbasis garis" dan "membalikkan hasil" untuk mendapatkan daftar baris yang tidak cocok dalam file yang Anda telusuri.
sumber
(?!
berguna dalam praktik. Meskipun secara tegas, melihat ke depan bukanlah ekspresi reguler seperti yang didefinisikan secara matematis.Anda dapat menulis ekspresi reguler terbalik secara manual.
Berikut adalah program untuk menghitung hasil secara otomatis. Hasilnya adalah hasil mesin, yang biasanya jauh lebih kompleks daripada tulisan tangan. Tapi hasilnya berhasil.
sumber
Saya baru saja menemukan metode ini yang mungkin intensif perangkat keras tetapi berfungsi:
Anda dapat mengganti semua karakter yang cocok dengan regex dengan string kosong.
Ini adalah satu perjalanan:
notMatched = re.sub(regex, "", string)
Saya menggunakan ini karena saya terpaksa menggunakan regex yang sangat kompleks dan tidak tahu cara membalikkan setiap bagiannya dalam waktu yang wajar.
Ini hanya akan mengembalikan Anda hasil string, bukan objek yang cocok!
sumber
Dalam perl Anda bisa melakukannya
proses ($ baris) if ($ line = ~! / Andrea /);
sumber