Saya tahu adalah mungkin untuk mencocokkan sebuah kata dan kemudian membalikkan kecocokan menggunakan alat lain (misalnya grep -v
). Namun, apakah mungkin untuk mencocokkan baris yang tidak mengandung kata tertentu, misalnya hede
, menggunakan ekspresi reguler?
Memasukkan:
hoho
hihi
haha
hede
Kode:
grep "<Regex for 'doesn't contain hede'>" input
Output yang diinginkan:
hoho
hihi
haha
regex
regex-negation
knaser
sumber
sumber
([^h]*(h([^e]|$)|he([^d]|$)|hed([^e]|$)))*
:? Idenya sederhana. Terus mencocokkan sampai Anda melihat awal string yang tidak diinginkan, maka hanya cocok dalam kasus N-1 di mana string belum selesai (di mana N adalah panjang string). Kasus N-1 ini adalah "h diikuti oleh non-e", "ia diikuti oleh non-d", dan "hed diikuti oleh non-e". Jika Anda berhasil meneruskan kasus N-1 ini, Anda berhasil tidak cocok dengan string yang tidak diinginkan sehingga Anda dapat mulai mencari[^h]*
lagi^([^h]*(h([^e]|$)|he([^d]|$)|hed([^e]|$))?)*$
ini gagal ketika contoh "hede" didahului dengan contoh parsial "hede" seperti dalam "hhede".Jawaban:
Gagasan bahwa regex tidak mendukung pencocokan terbalik tidak sepenuhnya benar. Anda dapat meniru perilaku ini dengan menggunakan sekeliling negatif:
Regex di atas akan cocok dengan string apa pun, atau garis tanpa jeda baris, tidak mengandung (sub) string 'hede'. Seperti disebutkan, ini bukan sesuatu regex adalah "baik" di (atau harus dilakukan), tapi masih, itu adalah mungkin.
Dan jika Anda juga harus mencocokkan baris break karakter, gunakan pengubah DOT-ALL (trailing
s
dalam pola berikut):atau gunakan sebaris:
(di mana
/.../
pembatas regex, yaitu, bukan bagian dari pola)Jika pengubah DOT-ALL tidak tersedia, Anda dapat meniru perilaku yang sama dengan kelas karakter
[\s\S]
:Penjelasan
String hanyalah daftar
n
karakter. Sebelum, dan setelah setiap karakter, ada string kosong. Jadi daftarn
karakter akan memilikin+1
string kosong. Pertimbangkan string"ABhedeCD"
:dimana
e
's adalah string kosong. Regex(?!hede).
melihat ke depan untuk melihat apakah tidak ada substring"hede"
untuk dilihat, dan jika itu yang terjadi (jadi sesuatu yang lain terlihat), maka.
(titik) akan cocok dengan karakter apa pun kecuali jeda baris. Look-arounds juga disebut pernyataan nol-lebar- karena mereka tidak mengkonsumsi karakter apa pun. Mereka hanya menegaskan / memvalidasi sesuatu.Jadi, dalam contoh saya, setiap string kosong terlebih dahulu divalidasi untuk melihat apakah tidak ada
"hede"
di depan, sebelum karakter dikonsumsi oleh.
(titik). Regex(?!hede).
akan melakukannya hanya sekali, sehingga dibungkus dalam kelompok, dan mengulangi nol atau lebih kali:((?!hede).)*
. Akhirnya, input awal dan akhir berlabuh untuk memastikan seluruh input dikonsumsi:^((?!hede).)*$
Seperti yang Anda lihat, masukan
"ABhedeCD"
akan gagal karena padae3
, regex(?!hede)
gagal (ada yang"hede"
di depan!).sumber
grep
, yang OP sebutkan) dengan dukungan regex semuanya memiliki fitur yang membuatnya tidak teratur dalam arti teoritis.^\(\(hede\)\@!.\)*$
Perhatikan bahwa solusi untuk tidak memulai dengan "hede" :
umumnya jauh lebih efisien daripada solusi untuk tidak mengandung "hede" :
Mantan memeriksa "hede" hanya di posisi pertama string input, daripada di setiap posisi.
sumber
(.*)(?<!hede)$
. Versi @Nyerguds akan bekerja dengan baik tetapi benar-benar melewatkan poin kinerja yang disebutkan jawabannya.^((?!hede).)*$
? Apakah tidak lebih efisien untuk digunakan^(?!.*hede).*$
? Itu melakukan hal yang sama tetapi dalam langkah yang lebih sedikitJika Anda hanya menggunakannya untuk grep, Anda bisa menggunakan
grep -v hede
untuk mendapatkan semua baris yang tidak mengandung hede.ETA Oh, membaca ulang pertanyaan,
grep -v
mungkin apa yang Anda maksud dengan "opsi alat".sumber
grep -v -e hede -e hihi -e ...
grep -v "hede\|hihi"
:)grep -vf pattern_file file
egrep
ataugrep -Ev "hede|hihi|etc"
untuk menghindari canggung melarikan diri.Menjawab:
Penjelasan:
^
awal string,(
grup dan tangkap ke \ 1 (0 kali atau lebih (cocok dengan jumlah sebanyak mungkin)),(?!
lihat ke depan untuk melihat apakah tidak ada,hede
string kamu,)
akhir pandangan ke depan,.
karakter apa pun kecuali \ n,)*
akhir \ 1 (Catatan: karena Anda menggunakan kuantifier pada tangkapan ini, hanya pengulangan TERAKHIR dari pola yang ditangkap akan disimpan di \ 1)$
sebelum opsional \ n, dan akhir stringsumber
^((?!DSAU_PW8882WEB2|DSAU_PW8884WEB2|DSAU_PW8884WEB).)*$
'Jawaban yang diberikan baik-baik saja, hanya poin akademis:
Ekspresi Reguler dalam arti ilmu komputer teoretis TIDAK MAMPU melakukannya seperti ini. Bagi mereka itu harus terlihat seperti ini:
Ini hanya cocok dengan LENGKAP. Melakukannya untuk sub-pertandingan bahkan akan lebih canggung.
sumber
(hede|Hihi)
'? (Ini mungkin pertanyaan untuk CS.)Jika Anda ingin tes regex gagal hanya jika seluruh string cocok, yang berikut ini akan berfungsi:
mis. - Jika Anda ingin mengizinkan semua nilai kecuali "foo" (yaitu "foofoo", "barfoo", dan "foobar" akan lulus, tetapi "foo" akan gagal), gunakan:
^(?!foo$).*
Tentu saja, jika Anda memeriksa kesetaraan yang tepat , solusi umum yang lebih baik dalam hal ini adalah memeriksa kesetaraan string, yaitu
Anda bahkan bisa meletakkan negasi di luar tes jika Anda memerlukan fitur regex (di sini, tidak sensitif huruf dan pencocokan kisaran):
Solusi regex di bagian atas jawaban ini mungkin membantu, dalam situasi di mana tes regex positif diperlukan (mungkin oleh API).
sumber
" hede "
?\s
directive cocok dengan karakter spasi putih tunggal^(?!\s*hede\s*$).*
FWIW, karena bahasa reguler (alias bahasa rasional) ditutup dengan komplemen, selalu memungkinkan untuk menemukan ekspresi reguler (alias ekspresi rasional) yang meniadakan ekspresi lain. Tetapi tidak banyak alat yang mengimplementasikan ini.
Vcsn mendukung operator ini (yang ditunjukkannya
{c}
, postfix).Pertama-tama Anda menentukan jenis ekspresi Anda: label adalah huruf (
lal_char
) untuk memilih daria
kez
misalnya (mendefinisikan alfabet ketika bekerja dengan komplementasi, tentu saja, sangat penting), dan "nilai" yang dihitung untuk setiap kata hanyalah Boolean :true
kata diterimafalse
,, ditolak.Dengan Python:
lalu Anda memasukkan ekspresi Anda:
ubah ekspresi ini menjadi otomat:
akhirnya, ubah otomat ini kembali ke ekspresi sederhana.
di mana
+
biasanya dilambangkan|
,\e
menunjukkan kata kosong, dan[^]
biasanya ditulis.
(karakter apa saja). Jadi, dengan sedikit penulisan ulang()|h(ed?)?|([^h]|h([^e]|e([^d]|d([^e]|e.)))).*
.Anda dapat melihat contoh ini di sini , dan coba Vcsn online di sana .
sumber
|
tidak akan bermain dengan baik.'^(()|h(ed?)?|([^h]|h([^e]|e([^d]|d([^e]|e.)))).*)$'
.Berikut adalah penjelasan yang baik tentang mengapa tidak mudah untuk meniadakan regex sewenang-wenang Tetapi saya harus setuju dengan jawaban yang lain: jika ini bukan pertanyaan hipotetis, maka regex bukanlah pilihan yang tepat di sini.
sumber
Dengan lookahead negatif, ekspresi reguler dapat mencocokkan sesuatu yang tidak mengandung pola tertentu. Ini dijawab dan dijelaskan oleh Bart Kiers. Penjelasan hebat!
Namun, dengan jawaban Bart Kiers, bagian lookahead akan menguji 1 hingga 4 karakter di depan sambil mencocokkan setiap karakter tunggal. Kita dapat menghindari ini dan membiarkan bagian lookahead memeriksa seluruh teks, memastikan tidak ada 'hede', dan kemudian bagian normal (. *) Dapat memakan seluruh teks sekaligus.
Berikut adalah regex yang ditingkatkan:
Perhatikan quantifier lazy (*?) Di bagian lookahead negatif adalah opsional, Anda dapat menggunakan (*) quantifier greedy sebagai gantinya, tergantung pada data Anda: jika 'hede' ada dan di bagian awal teks, lazy quantifier dapat lebih cepat; jika tidak, quantifier rakus menjadi lebih cepat. Namun jika 'hede' tidak ada, keduanya akan sama lambat.
Ini kode demo .
Untuk informasi lebih lanjut tentang lookahead, silakan lihat artikel hebat: Menguasai Lookahead dan Lookbehind .
Juga, silakan periksa RegexGen.js , Generator Ekspresi Reguler JavaScript yang membantu membangun ekspresi reguler yang kompleks. Dengan RegexGen.js, Anda bisa membuat regex dengan cara yang lebih mudah dibaca:
sumber
^(?!.*(str1|str2)).*$
^(?!.*?(?:str1|str2)).*$
tergantung pada data Anda. Menambahkan?:
karena kita tidak perlu menangkapnya.Tolak ukur
Saya memutuskan untuk mengevaluasi beberapa Opsi yang disajikan dan membandingkan kinerjanya, serta menggunakan beberapa Fitur baru. Benchmarking pada .NET Regex Engine: http://regexhero.net/tester/
Teks Benchmark:
7 baris pertama tidak boleh cocok, karena mengandung Ekspresi yang dicari, sedangkan 7 baris bawah harus cocok!
Hasil:
Hasilnya adalah Iterasi per detik sebagai median 3 run - Bigger Number = Better
Sejak .NET tidak mendukung action Verbs (* FAIL, dll.) Saya tidak bisa menguji solusi P1 dan P2.
Ringkasan:
Saya mencoba menguji sebagian besar solusi yang diajukan, beberapa Optimalisasi dimungkinkan untuk kata-kata tertentu. Sebagai Contoh jika dua huruf pertama dari string pencarian bukan Sama, jawaban 03 dapat diperluas untuk
^(?>[^R]+|R+(?!egex Hero))*$
menghasilkan peningkatan kinerja yang kecil.Tetapi solusi tercepat yang paling mudah dibaca dan berdasarkan kinerja tampaknya 05 menggunakan pernyataan bersyarat atau 04 dengan kuantifier positif. Saya pikir solusi Perl harus lebih cepat dan lebih mudah dibaca.
sumber
^(?!.*hede)
juga. /// Selain itu, mungkin lebih baik untuk memberi peringkat ekspresi untuk korpus yang cocok dan korpus yang tidak cocok secara terpisah karena biasanya merupakan kasus yang sebagian besar baris cocok atau sebagian besar baris tidak.Bukan regex, tapi saya merasa logis dan berguna menggunakan serial greps dengan pipa untuk menghilangkan noise.
misalnya. cari file konfigurasi apache tanpa semua komentar-
dan
Logika serial grep adalah (bukan komentar) dan (cocok dengan dir)
sumber
grep -v
good_stuff #comment_stuff
dengan ini, Anda menghindari untuk menguji lookahead di setiap posisi:
setara dengan (untuk .net):
Jawaban lama:
sumber
/^[^h]*(?:h+(?!ede)[^h]*)*$/
Aforemention
(?:(?!hede).)*
sangat bagus karena dapat ditambatkan.Tetapi yang berikut ini sudah cukup dalam hal ini:
Penyederhanaan ini siap ditambahkan klausa "DAN":
sumber
Begini cara saya melakukannya:
Akurat dan lebih efisien daripada jawaban lainnya. Ini menerapkan teknik efisiensi "membuka gulungan-the-loop" Friedl dan membutuhkan jauh lebih sedikit mundur.
sumber
Jika Anda ingin mencocokkan karakter untuk meniadakan kata yang mirip dengan meniadakan kelas karakter:
Misalnya, string:
Jangan gunakan:
Menggunakan:
Perhatikan
"(?!bbb)."
bukan melihat di belakang atau melihat ke depan, itu terlihat saat ini, misalnya:sumber
(?!
). Awalan lookahead positif adalah(?=
sementara awalan lookhead yang sesuai akan(?<!
dan(?<=
masing - masing. Sebuah lookahead berarti Anda membaca karakter berikutnya (karenanya "maju") tanpa mengkonsumsinya. Melihat ke belakang berarti Anda memeriksa karakter yang sudah digunakan.An, menurut pendapat saya, varian jawaban teratas yang lebih mudah dibaca:
Pada dasarnya, "cocokkan di awal baris jika dan hanya jika tidak ada 'hede' di dalamnya" - sehingga persyaratan diterjemahkan hampir secara langsung ke dalam regex.
Tentu saja, ada beberapa persyaratan kegagalan:
Detail: Jangkar ^ memastikan mesin regex tidak mencoba ulang kecocokan di setiap lokasi dalam string, yang akan cocok dengan setiap string.
Jangkar pada awalnya dimaksudkan untuk mewakili awal dari garis. Alat grep mencocokkan setiap baris satu per satu, dalam konteks di mana Anda bekerja dengan string multiline, Anda dapat menggunakan bendera "m":
atau
sumber
OP tidak menentukan atau Tagposting yang mengindikasikan konteks (bahasa pemrograman, editor, alat) yang akan digunakan Regex.
Bagi saya, kadang-kadang saya perlu melakukan ini saat mengedit file menggunakan
Textpad
.Textpad
mendukung beberapa Regex, tetapi tidak mendukung lookahead atau lookhhind, sehingga dibutuhkan beberapa langkah.Jika saya ingin mempertahankan semua baris yang TIDAK mengandung string
hede
, saya akan melakukannya seperti ini:Sekarang Anda memiliki teks asli dengan semua baris yang berisi string
hede
dihapus.Jika saya mencari untuk melakukan sesuatu yang lain untuk hanya baris yang TIDAK mengandung string
hede
, saya akan melakukannya seperti ini:sumber
Karena tidak ada orang lain yang memberikan jawaban langsung untuk pertanyaan yang diajukan , saya akan melakukannya.
Jawabannya adalah bahwa dengan POSIX
grep
, mustahil untuk benar-benar memenuhi permintaan ini:Alasannya adalah bahwa POSIX
grep
hanya diperlukan untuk bekerja dengan Ekspresi Reguler Dasar , yang sama sekali tidak cukup kuat untuk menyelesaikan tugas itu (mereka tidak mampu menguraikan bahasa biasa, karena kurangnya pergantian dan tanda kurung).Namun, GNU
grep
mengimplementasikan ekstensi yang memungkinkannya. Secara khusus,\|
adalah operator pergantian dalam implementasi BRE GNU, dan\(
dan\)
adalah tanda kurung. Jika mesin ekspresi reguler Anda mendukung pergantian, ekspresi braket negatif, tanda kurung, dan bintang Kleene, dan mampu berlabuh ke awal dan akhir string, hanya itu yang Anda butuhkan untuk pendekatan ini. Namun perlu dicatat bahwa set negatif[^ ... ]
sangat nyaman selain itu, karena jika tidak, Anda perlu menggantinya dengan ekspresi dari formulir(a|b|c| ... )
yang mencantumkan setiap karakter yang tidak ada di set, yang sangat membosankan dan terlalu lama, terlebih lagi jika set karakter keseluruhan adalah Unicode.Dengan GNU
grep
, jawabannya akan seperti:(ditemukan dengan Grail dan beberapa optimasi lebih lanjut dibuat dengan tangan).
Anda juga dapat menggunakan alat yang mengimplementasikan Ekspresi Reguler Diperpanjang , seperti
egrep
, untuk menghilangkan garis miring terbalik:Berikut ini skrip untuk mengujinya (perhatikan ini menghasilkan file
testinput.txt
di direktori saat ini):Dalam sistem saya itu mencetak:
seperti yang diharapkan.
Bagi mereka yang tertarik dengan perincian, teknik yang digunakan adalah mengubah ekspresi reguler yang cocok dengan kata menjadi otomat terbatas, kemudian membalikkan automaton dengan mengubah setiap keadaan penerimaan menjadi non-penerimaan dan sebaliknya, dan kemudian mengubah FA yang dihasilkan kembali ke ekspresi reguler.
Akhirnya, seperti yang dicatat oleh semua orang, jika mesin ekspresi reguler Anda mendukung tampilan negatif, itu menyederhanakan banyak tugas. Misalnya, dengan GNU grep:
Pembaruan: Saya baru-baru ini menemukan pustaka FormalTheory Kendall Hopkins yang sangat baik , ditulis dalam PHP, yang menyediakan fungsionalitas yang mirip dengan Grail. Dengan menggunakannya, dan penyederhanaan yang ditulis sendiri, saya dapat menulis generator online ekspresi reguler negatif yang diberi frasa input (hanya karakter alfanumerik dan spasi yang saat ini didukung): http://www.formauri.es/personal/ pgimeno / misc / non-match-regex /
Untuk
hede
itu output:yang setara dengan di atas.
sumber
Sejak diperkenalkannya ruby-2.4.1, kita dapat menggunakan Operator Absen yang baru dalam Ekspresi Reguler Ruby
dari dokumen resmi
Dengan demikian, dalam kasus Anda
^(?~hede)$
melakukan pekerjaan untuk Andasumber
Melalui kata kerja PCRE
(*SKIP)(*F)
Ini akan sepenuhnya melompati garis yang berisi string yang tepat
hede
dan cocok dengan semua baris yang tersisa.DEMO
Eksekusi bagian:
Mari kita perhatikan regex di atas dengan membaginya menjadi dua bagian.
Bagian sebelum
|
simbol. Bagian tidak harus dicocokkan .Bagian setelah
|
simbol. Bagian harus dicocokkan .BAGIAN 1
Mesin Regex akan memulai eksekusi dari bagian pertama.
Penjelasan:
^
Menegaskan bahwa kami berada di awal.hede
Cocok dengan stringhede
$
Menyatakan bahwa kita berada di garis akhir.Jadi garis yang berisi string
hede
akan cocok. Setelah mesin regex melihat kata kerja berikut(*SKIP)(*F)
( Catatan: Anda bisa menulis(*F)
sebagai(*FAIL)
), itu melompat dan membuat pertandingan gagal.|
disebut alteration atau logis ATAU operator ditambahkan di sebelah kata kerja PCRE yang inturn cocok dengan semua batas yang ada antara masing-masing dan setiap karakter pada semua baris kecuali baris berisi string yang tepathede
. Lihat demo di sini . Artinya, ia mencoba untuk mencocokkan karakter dari string yang tersisa. Sekarang regex di bagian kedua akan dieksekusi.BAGIAN 2
Penjelasan:
^
Menegaskan bahwa kami berada di awal. yaitu, cocok dengan semua baris yang dimulai kecuali yang ada dihede
baris. Lihat demo di sini ..*
Dalam mode Multiline,.
akan cocok dengan karakter apa pun kecuali baris baru atau karakter carriage return. Dan*
akan mengulangi karakter sebelumnya nol atau lebih banyak kali. Jadi.*
akan cocok dengan seluruh lini. Lihat demo di sini .Hei mengapa Anda menambahkan. * Bukan. +?
Karena
.*
akan cocok dengan garis kosong tetapi.+
tidak akan cocok dengan garis kosong. Kami ingin mencocokkan semua baris kecualihede
, mungkin ada kemungkinan baris kosong juga di input. sehingga Anda harus menggunakan.*
bukan.+
..+
akan mengulangi karakter sebelumnya satu kali atau lebih. Lihat.*
cocok dengan garis kosong di sini .$
Akhir jangkar baris tidak diperlukan di sini.sumber
Mungkin lebih mudah dikelola untuk dua regex dalam kode Anda, satu untuk melakukan pencocokan pertama, dan kemudian jika itu cocok jalankan regex kedua untuk memeriksa kasus-kasus outlier yang ingin Anda blokir misalnya
^.*(hede).*
maka miliki logika yang sesuai dalam kode Anda.OK, saya akui ini bukan jawaban untuk pertanyaan yang diposting dan mungkin juga menggunakan sedikit lebih banyak pemrosesan daripada satu regex. Tetapi untuk pengembang yang datang ke sini mencari perbaikan darurat yang cepat untuk kasus outlier maka solusi ini tidak boleh diabaikan.
sumber
Opsi lain adalah menambahkan pandangan positif ke depan dan memeriksa apakah
hehe
ada di baris input, maka kita akan meniadakannya, dengan ekspresi yang mirip dengan:dengan batas kata.
Ekspresi dijelaskan pada panel kanan atas regex101.com , jika Anda ingin menjelajahi / menyederhanakan / memodifikasinya, dan di tautan ini , Anda dapat menonton bagaimana itu akan cocok dengan beberapa input sampel, jika Anda mau.
Sirkuit RegEx
jex.im memvisualisasikan ekspresi reguler:
sumber
The TXR Bahasa mendukung negasi regex.
Contoh yang lebih rumit: cocokkan semua baris yang dimulai dengan
a
dan diakhiri denganz
, tetapi tidak mengandung substringhede
:Negasi Regex tidak terlalu berguna dengan sendirinya tetapi ketika Anda juga memiliki persimpangan, hal-hal menjadi menarik, karena Anda memiliki set lengkap operasi set boolean: Anda dapat mengekspresikan "set yang cocok dengan ini, kecuali untuk hal-hal yang cocok dengan itu".
sumber
Fungsi di bawah ini akan membantu Anda mendapatkan hasil yang diinginkan
sumber
^ ((?! hede).) * $ adalah solusi yang elegan, kecuali karena menghabiskan karakter Anda tidak akan dapat menggabungkannya dengan kriteria lain. Misalnya, Anda ingin memeriksa tidak adanya "hede" dan "haha". Solusi ini akan berfungsi karena tidak akan menggunakan karakter:
^ (?!. \ bhede \ b) (? =. \ bhaha \ b)
sumber
Cara menggunakan kata kerja kontrol mundur PCRE untuk mencocokkan baris yang tidak mengandung kata
Inilah metode yang belum pernah saya lihat digunakan sebelumnya:
Bagaimana itu bekerja
Pertama, ia mencoba untuk menemukan "hede" di suatu tempat di barisan. Jika berhasil, pada titik ini,
(*COMMIT)
memberitahu mesin untuk, tidak hanya tidak mundur jika terjadi kegagalan, tetapi juga tidak mencoba pencocokan lebih lanjut dalam kasus itu. Kemudian, kami mencoba mencocokkan sesuatu yang tidak mungkin cocok (dalam hal ini,^
).Jika sebuah baris tidak mengandung "hede" maka alternatif kedua, sebuah subpattern kosong, berhasil cocok dengan string subjek.
Metode ini tidak lebih efisien daripada lookahead negatif, tapi saya pikir saya hanya akan membuangnya di sini kalau-kalau ada orang yang menemukan itu bagus dan menemukan menggunakannya untuk aplikasi lain yang lebih menarik.
sumber
Solusi yang lebih sederhana adalah dengan menggunakan bukan operator !
Pernyataan if Anda harus cocok dengan "mengandung" dan tidak cocok dengan "dikecualikan".
Saya percaya para desainer RegEx mengantisipasi penggunaan bukan operator.
sumber
Mungkin Anda akan menemukan ini di Google ketika mencoba menulis regex yang dapat mencocokkan segmen garis (sebagai lawan dari seluruh baris) yang tidak mengandung substring. Butuh beberapa saat untuk mencari tahu, jadi saya akan membagikan:
Diberikan string:
<span class="good">bar</span><span class="bad">foo</span><span class="ugly">baz</span>
Saya ingin mencocokkan
<span>
tag yang tidak mengandung "buruk" substring./<span(?:(?!bad).)*?>
akan cocok<span class=\"good\">
dan<span class=\"ugly\">
.Perhatikan bahwa ada dua set (lapisan) tanda kurung:
Demo di Ruby:
sumber
Dengan ConyEdit , Anda dapat menggunakan baris perintah
cc.gl !/hede/
untuk mendapatkan baris yang tidak mengandung pencocokan regex, atau menggunakan baris perintahcc.dl /hede/
untuk menghapus baris yang berisi pencocokan regex. Mereka memiliki hasil yang sama.sumber
Saya ingin menambahkan contoh lain untuk jika Anda mencoba untuk mencocokkan seluruh baris yang berisi string X , tetapi tidak juga mengandung string Y .
Sebagai contoh, katakanlah kita ingin memeriksa apakah URL / string kita mengandung " suguhan lezat ", asalkan tidak juga mengandung " cokelat " di mana saja.
Pola regex ini akan berfungsi (berfungsi dalam JavaScript juga)
(global, bendera multiline misalnya)
Contoh Interaktif: https://regexr.com/53gv4
Cocok
(URL ini mengandung "suguhan lezat" dan juga tidak mengandung "cokelat")
Tidak cocok
(URL ini mengandung "cokelat" di suatu tempat - sehingga tidak akan cocok meskipun mengandung "suguhan lezat")
sumber