Saya punya regex, misalnya (ma|(t){1})
. Itu cocok ma
dan t
dan tidak cocok bla
.
Saya ingin meniadakan regex, sehingga harus sesuai bla
dan tidak ma
dan t
, dengan menambahkan sesuatu untuk regex ini . Saya tahu saya bisa menulis bla
, namun ekspresi reguler sebenarnya lebih kompleks.
regex
regex-negation
IAdapter
sumber
sumber
{1}
sama sekali tidak berguna. (Jika menurut Anda itu memberikan nilai, mengapa Anda tidak menulis((m{1}a{1}){1}|(t){1}){1}
?)Jawaban:
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):
sumber
grep
.Pattern.compile("(?!(a.*b))").matcher("xab").matches()
seharusnyatrue
, bukan?Dengan asumsi Anda hanya ingin melarang string yang benar-benar cocok dengan ekspresi reguler (yaitu,
mmbla
tidak masalah, tetapimm
tidak), inilah yang Anda inginkan:(?!(?:m{2}|t)$)
adalah negatif lookahead ; itu mengatakan "mulai dari posisi saat ini, beberapa karakter berikutnya bukanmm
ataut
, 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.sumber
.*
ke akhir regex Anda, jika tidak maka akan menolak setiap string.$
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.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
sumber
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_match
fungsi PHP secara internal.sumber