Saya mencari arti dari ungkapan-ungkapan ini tetapi tidak dapat memahami perbedaan yang tepat di antara mereka. Inilah yang mereka katakan:
?:
Cocokkan ekspresi tetapi jangan menangkapnya.?=
Cocokkan sufiks tetapi kecualikan dari tangkapan.?!
Cocok jika sufiks tidak ada.
Saya mencoba menggunakan ini dalam RegEx sederhana dan mendapatkan hasil yang serupa untuk semua. contoh: 3 ekspresi berikut memberikan hasil yang sangat mirip.
[a-zA-Z0-9._-]+@[a-zA-Z0-9-]+(?!\.[a-zA-Z0-9]+)*
[a-zA-Z0-9._-]+@[a-zA-Z0-9-]+(?=\.[a-zA-Z0-9]+)*
[a-zA-Z0-9._-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9]+)*
javascript
regex
RK Poddar
sumber
sumber
*
setelah grup, jadi mereka diabaikan begitu saja.Jawaban:
Perbedaan antara
?=
dan?!
adalah bahwa yang pertama membutuhkan ekspresi yang diberikan agar cocok dan yang terakhir membutuhkan ekspresi yang tidak cocok. Misalnyaa(?=b)
akan cocok dengan "a" di "ab", tapi bukan "a" di "ac". Padahala(?!b)
akan cocok dengan "a" di "ac", tapi bukan "a" di "ab".Perbedaan antara
?:
dan?=
is yang?=
mengecualikan ekspresi dari keseluruhan pertandingan sementara?:
tidak membuat grup penangkap. Jadi misalnyaa(?:b)
akan cocok dengan "ab" di "abc", sedangkana(?=b)
hanya akan cocok dengan "a" di "abc".a(b)
akan cocok dengan "ab" di "abc" dan membuat gambar yang berisi "b".sumber
Silakan periksa di sini: http://www.regular-expressions.info/lookaround.html untuk tutorial yang sangat bagus dan contoh tentang lookahead dalam ekspresi reguler.
sumber
Untuk lebih memahami, mari terapkan tiga ekspresi plus grup penangkap dan analisis setiap perilaku.
()
grup penangkap - ekspresi reguler di dalam tanda kurung harus cocok dan kecocokan membuat grup penangkap(?:)
non capturing group - regex di dalam tanda kurung harus cocok tetapi tidak membuat grup penangkap(?=)
positif melihat ke depan - menegaskan bahwa ekspresi reguler harus dicocokkan(?!)
pandangan negatif ke depan - menegaskan bahwa tidak mungkin untuk mencocokkan ekspresi regulerMari mendaftar
q(u)i
untuk berhenti .q
cocok dengan q dan kelompok penangkapu
cocok dengan u . Pertandingan di dalam grup penangkap diambil dan grup penangkap dibuat. Jadi mesin terus berlanjuti
. Dani
akan cocok dengan saya . Upaya pertandingan terakhir ini berhasil. qui dicocokkan dan grup penangkap dengan u dibuat.Mari mendaftar
q(?:u)i
untuk berhenti . Sekali lagi,q
cocokkan q dan grup yang tidak menangkapu
cocok dengan u . Pertandingan dari grup non-penangkap diambil, tetapi grup penangkap tidak dibuat. Jadi mesin terus berlanjuti
. Dani
akan cocok dengan saya . Upaya pertandingan terakhir ini berhasil. qui cocokMari mendaftar
q(?=u)i
untuk berhenti . Lookahead itu positif dan diikuti oleh tanda lain. Sekali lagi,q
cocokkan q danu
cocokkan dengan u . Sekali lagi, kecocokan dari lookahead harus dibuang, sehingga mesin mundur darii
string ke u . Lookahead itu berhasil, jadi mesinnya terus berjalani
. Tapii
tidak bisa menandingi kamu . Jadi percobaan pertandingan ini gagal.Mari mendaftar
q(?=u)u
untuk berhenti . Lookahead itu positif dan diikuti oleh tanda lain. Sekali lagi,q
cocokkan q danu
cocokkan dengan u . Kecocokan dari lookahead harus dibuang, sehingga mesin mundur dariu
string ke u . Lookahead itu berhasil, jadi mesinnya terus berjalanu
. Danu
akan cocok denganmu . Jadi percobaan pertandingan ini berhasil. qu cocokMari mendaftar
q(?!i)u
untuk berhenti . Bahkan dalam hal ini lookahead bernilai positif (karenai
tidak cocok) dan diikuti oleh token lain. Sekali lagi,q
cocok dengan q dani
tidak cocok dengan u . Kecocokan dari lookahead harus dibuang, sehingga mesin mundur dariu
string ke u . Lookahead itu berhasil, jadi mesinnya terus berjalanu
. Danu
akan cocok denganmu . Jadi percobaan pertandingan ini berhasil. qu cocokJadi, kesimpulannya, perbedaan nyata antara grup lookahead dan non-capturing adalah jika Anda hanya ingin menguji keberadaan atau menguji dan menyimpan pertandingan. Menangkap grup itu mahal jadi gunakan dengan bijaksana.
sumber
Coba cocokkan
foobar
dengan ini:Regex pertama akan cocok dan akan mengembalikan "bar" sebagai submatch pertama -
(?=b)
cocok dengan 'b', tetapi tidak menggunakannya, membiarkannya di tanda kurung berikut.Regex kedua TIDAK akan cocok, karena mengharapkan "foo" diikuti oleh sesuatu yang berbeda dari 'b'.
(?:...)
memiliki efek yang persis sama seperti simple(...)
, tetapi tidak mengembalikan bagian tersebut sebagai submatch.sumber
Cara termudah untuk memahami pernyataan adalah dengan memperlakukannya sebagai perintah yang dimasukkan ke dalam ekspresi reguler. Saat mesin menjalankan pernyataan, mesin akan segera memeriksa kondisi yang dijelaskan oleh pernyataan tersebut. Jika hasilnya benar, lanjutkan menjalankan ekspresi reguler.
sumber
Inilah perbedaan nyata:
Jika Anda tidak peduli konten setelah "?:" Atau "? =", "?:" Dan "? =" Sama saja. Keduanya baik-baik saja untuk digunakan.
Tetapi jika Anda membutuhkan konten tersebut untuk proses lebih lanjut (tidak hanya mencocokkan semuanya. Dalam hal ini Anda cukup menggunakan "a (b)") Anda harus menggunakan "? =" Sebagai gantinya. Penyebab "?:" Akan melewatinya.
sumber