Saya belum dapat menemukan regex yang tepat untuk mencocokkan string apa pun yang tidak berakhir dengan kondisi tertentu. Misalnya, saya tidak ingin mencocokkan apa pun yang berakhir dengan a
.
Ini cocok
b
ab
1
Ini tidak cocok
a
ba
Saya tahu regex harus diakhiri dengan $
untuk menandai akhirnya, meskipun saya tidak tahu apa yang harus mendahuluinya.
Sunting : Pertanyaan aslinya sepertinya bukan contoh yang sah untuk kasus saya. Jadi: bagaimana menangani lebih dari satu karakter? Katakan sesuatu yang tidak berakhir dengan ab
?
Saya sudah bisa memperbaikinya, menggunakan utas ini :
.*(?:(?!ab).).$
Meskipun downside dengan ini, itu tidak cocok dengan satu karakter.
Jawaban:
Anda tidak memberi kami bahasa, tetapi jika dukungan rasa regex Anda melihat di belakang pernyataan , inilah yang Anda butuhkan:
(?<!a)
adalah tampilan yang dinegasikan di belakang pernyataan yang memastikan, bahwa sebelum akhir string (atau baris denganm
pengubah), tidak ada karakter "a".Lihat di sini di Regexr
Anda juga dapat dengan mudah memperluas ini dengan karakter lain, karena ini memeriksa string dan bukan kelas karakter.
Ini akan cocok dengan apa pun yang tidak berakhir dengan "ab", lihat di Regexr
sumber
Gunakan simbol not (
^
):Jika Anda meletakkan
^
simbol di awal tanda kurung, itu berarti "segala sesuatu kecuali benda-benda di dalam tanda kurung."$
hanyalah sebuah jangkar sampai akhir.Untuk beberapa karakter , cukup letakkan semuanya dalam rangkaian karakter mereka sendiri:
sumber
ae
ataucb
.Untuk mencari file yang tidak diakhiri dengan ".tmp" kami menggunakan regex berikut:
Diuji dengan Regex Tester memberikan hasil sebagai berikut:
sumber
^.*(?![.]tmp$)
tidak?.*
Anda sudah cocok dengan seluruh string, sehingga pengecualian yang tersisa tidak berfungsi lagi.regex di atas akan cocok dengan string yang tidak berakhir dengan
a
.sumber
Coba ini
Yang
[]
menunjukkan kelas karakter, dan^
membalikkan kelas karakter untuk mencocokkan segalanya kecuali sebuaha
.sumber
Pertanyaannya sudah lama tetapi saya tidak dapat menemukan solusi yang lebih baik yang saya posting di sini. Temukan semua drive USB tetapi tidak mencantumkan partisi , sehingga menghapus "bagian [0-9]" dari hasil. Saya akhirnya melakukan dua grep, yang terakhir meniadakan hasilnya:
Ini hasil pada sistem saya:
Jika saya hanya ingin partisi yang bisa saya lakukan:
Di mana saya mendapatkan:
Dan ketika saya melakukannya:
Saya mendapat:
sumber
Jawaban yang diterima baik-baik saja jika Anda dapat menggunakan lookaround. Namun, ada juga pendekatan lain untuk menyelesaikan masalah ini.
Jika kita melihat regex yang diusulkan secara luas untuk pertanyaan ini:
.*[^a]$
Kami akan menemukan bahwa itu hampir berhasil. Itu tidak menerima string kosong, yang mungkin sedikit tidak nyaman. Namun, ini adalah masalah kecil ketika berhadapan dengan hanya satu karakter. Namun, jika kita ingin mengecualikan seluruh string, mis. "Abc", maka:
.*[^a][^b][^c]$
tidak akan melakukannya. Itu tidak akan menerima ac, misalnya.
Namun ada solusi mudah untuk masalah ini. Kita bisa mengatakan:
.{,2}$|.*[^a][^b][^c]$
atau versi yang lebih umum:
.{,n-1}$|.*[^firstchar][^secondchar]$
di mana n adalah panjang string yang Anda inginkan melarang (untukabc
itu 3), danfirstchar
,secondchar
, ... yang pertama, karakter kedua ... n dari string (untukabc
itu akan menjadia
, kemudianb
, kemudianc
).Ini berasal dari pengamatan sederhana bahwa string yang lebih pendek dari teks yang tidak akan kami larang tidak dapat memuat teks ini menurut definisi. Jadi kita bisa menerima apa pun yang lebih pendek ("ab" bukan "abc"), atau apa pun yang cukup lama untuk kita terima tetapi tanpa akhir.
Berikut ini contoh menemukan yang akan menghapus semua file yang bukan .jpg:
find . -regex '.{,3}$|.*[^.][^j][^p][^g]$' -delete
sumber
.{,2}$|.*[^a][^b][^c]$
tidak cocokccc
Apa pun yang cocok sesuatu yang berakhir dengan ---
.*a$
Jadi, ketika Anda cocok regex, meniadakan kondisi atau alternatifnya Anda juga dapat melakukan.*[^a]$
di mana[^a]
sarana apa saja yangnot a
sumber
Jika Anda menggunakan
grep
ataused
sintaks akan sedikit berbeda. Perhatikan bahwa[^a][^b]
metode sekuensial tidak berfungsi di sini:FWIW, saya menemukan hasil yang sama di Regex101 , yang saya pikir adalah sintaksis JavaScript.
Buruk: https://regex101.com/r/MJGAmX/2
Bagus: https://regex101.com/r/LzrIBu/2
sumber