Bagaimana cara meniadakan seluruh regex?

96

Saya punya regex, misalnya (ma|(t){1}). Itu cocok madan tdan tidak cocok bla.

Saya ingin meniadakan regex, sehingga harus sesuai bladan tidak madan t, dengan menambahkan sesuatu untuk regex ini . Saya tahu saya bisa menulis bla, namun ekspresi reguler sebenarnya lebih kompleks.

IAdapter
sumber
5
Sebagai tambahan, {1}sama sekali tidak berguna. (Jika menurut Anda itu memberikan nilai, mengapa Anda tidak menulis ((m{1}a{1}){1}|(t){1}){1}?)
tripleee

Jawaban:

100

Gunakan pencarian negatif: (?!pattern)

Pemantauan positif dapat digunakan untuk menegaskan bahwa suatu pola cocok. Pemantauan negatif adalah kebalikannya: ini digunakan untuk menyatakan bahwa suatu pola TIDAK cocok. Beberapa rasa mendukung pernyataan; beberapa membatasi tampilan di belakang, dll.

Tautan ke regular-expressions.info

Lihat juga

Lebih banyak contoh

Ini adalah upaya untuk menghasilkan solusi regex untuk masalah mainan sebagai latihan; mereka harus mendidik jika Anda mencoba mempelajari berbagai cara menggunakan lookarounds (menyarangkannya, menggunakannya untuk menangkap, dll):

poligenelubricants
sumber
2
regular-expressions.info adalah sumber yang sangat bagus untuk semua hal regex.
Freiheit
Apa semua harus lookaround dukungan? Tidak bekerja dengan grep.
Lazer
Pattern.compile("(?!(a.*b))").matcher("xab").matches()seharusnya true, bukan?
Karl Richter
4
Sepertinya ini tidak benar, lihat stackoverflow.com/questions/8610743/… untuk alternatif yang benar.
Karl Richter
56

Dengan asumsi Anda hanya ingin melarang string yang benar-benar cocok dengan ekspresi reguler (yaitu, mmblatidak masalah, tetapi mmtidak), inilah yang Anda inginkan:

^(?!(?:m{2}|t)$).*$

(?!(?:m{2}|t)$)adalah negatif lookahead ; itu mengatakan "mulai dari posisi saat ini, beberapa karakter berikutnya bukan mm atau t, diikuti oleh akhir string." Start anchor ( ^) di awal memastikan bahwa lookahead diterapkan di awal string. Jika berhasil, .*lanjutkan dan konsumsi string.

FYI, jika Anda menggunakan matches()metode Java , Anda tidak benar-benar membutuhkan yang ^dan yang terakhir $, tetapi tidak ada salahnya. Namun, $bagian dalam lookahead diperlukan.

Alan Moore
sumber
2
Bagian yang paling membantu dari jawaban ini adalah Anda harus menambahkan .*ke akhir regex Anda, jika tidak maka akan menolak setiap string.
Rav
2
Di $ dalam lookahead negatif, DAN .*di akhir keduanya bit kritis. Seperti biasa dengan RE, serangkaian pengujian unit yang kuat sangat penting untuk melakukannya dengan benar. Jawaban ini 100% benar.
Tom Dibble
1
\b(?=\w)(?!(ma|(t){1}))\b(\w*)

ini untuk regex yang diberikan.
\ b adalah menemukan batas kata.
pandangan positif ke depan (? = \ w) ada di sini untuk menghindari spasi.
pandangan negatif ke depan atas ekspresi reguler asli adalah untuk mencegah kecocokannya.
dan akhirnya (\ w *) adalah untuk menangkap semua kata yang tersisa.
grup yang akan menampung kata-kata adalah grup 3.
sederhana (?! pola) tidak akan berfungsi karena sub-string apa pun akan cocok
dengan ^ (?! (?: m {2} | t) $) sederhana. * $ will tidak berfungsi karena perinciannya adalah garis penuh

Ofer Skulsky
sumber
0

Terapkan ini jika Anda menggunakan laravel.

Laravel memiliki not_regex di mana bidang di bawah validasi tidak boleh cocok dengan ekspresi reguler yang diberikan; menggunakan preg_matchfungsi PHP secara internal.

'email' => 'not_regex:/^.+$/i'
DAVID AJAYI
sumber