Berikut adalah regex yang berfungsi dengan baik di sebagian besar implementasi regex:
(?<!filename)\.js$
Ini cocok dengan .js untuk string yang diakhiri dengan .js kecuali untuk filename.js
Javascript tidak memiliki tampilan regex di belakang. Adakah yang bisa menyusun regex alternatif yang mencapai hasil yang sama dan berfungsi dalam javascript?
Berikut adalah beberapa pemikiran, tetapi membutuhkan fungsi pembantu. Saya berharap untuk mencapainya hanya dengan sebuah regex: http://blog.stevenlevithan.com/archives/mimic-lookbehind-javascript
javascript
regex
daniel
sumber
sumber
(?<=thingy)thingy
untuk lookbehind positif dan(?<!thingy)thingy
untuk lookbehind negatif . Sekarang ini mendukung mereka.Jawaban:
^(?!filename).+\.js
bekerja untukkudiuji terhadap:
Penjelasan yang tepat untuk regex ini dapat ditemukan di ekspresi Reguler untuk mencocokkan string yang tidak mengandung kata?
Penampilan depan tersedia sejak versi 1.5 dari javascript dan didukung oleh semua browser utama
Diperbarui untuk mencocokkan filename2.js dan 2filename.js tetapi tidak filename.js
(^(?!filename\.js$).).+\.js
sumber
a.js
2filename.js
, tetapi regex yang diberikan di sini tidak. Yang lebih tepat adalah^(?!.*filename\.js$).*\.js$
. Ini berarti, cocok dengan*.js
kecuali*filename.js
.EDIT: Dari ECMAScript 2018 dan selanjutnya, pernyataan di balik (bahkan tidak terikat) didukung secara asli .
Di versi sebelumnya, Anda dapat melakukan ini:
Ini tidak secara eksplisit apa yang dilakukan ekspresi lookbehind secara implisit: periksa setiap karakter string jika ekspresi lookbehind ditambah regex setelah itu tidak akan cocok, dan hanya kemudian membiarkan karakter itu cocok.
Suntingan lain:
Sungguh menyakitkan bagi saya untuk mengatakan (terutama karena jawaban ini telah begitu banyak dipilih) bahwa ada cara yang jauh lebih mudah untuk mencapai tujuan ini. Tidak perlu memeriksa lookahead di setiap karakter:
berfungsi dengan baik:
sumber
2filename.js
. Regex saya cocok dengan kasus yang sama persis dengan contoh regex Anda.^(?!.*filename\.js$).*\.js$
akan berhasil. Mencoba memikirkan situasi di mana ncgroup mungkin masih diperlukan ...Misalkan Anda ingin menemukan semua yang
int
tidak didahului olehunsigned
:Dengan dukungan untuk tampilan negatif:
Tanpa dukungan untuk pandangan negatif:
Ide dasarnya adalah untuk mengambil n karakter sebelumnya dan mengecualikan kecocokan dengan pandangan negatif ke depan, tetapi juga mencocokkan kasus di mana tidak ada n karakter sebelumnya. (di mana n adalah panjang melihat ke belakang).
Jadi regex yang dimaksud:
akan diterjemahkan ke:
Anda mungkin perlu bermain dengan menangkap grup untuk menemukan titik yang tepat dari string yang menarik minat Anda atau Anda tidak ingin mengganti bagian tertentu dengan sesuatu yang lain.
sumber
(?<!barna)(?<!ene)(?<!en)(?<!erne) (?:sin|vår)e?(?:$| (?!egen|egne))
untuk(?!barna).(?!erne).(?!ene).(?!en).. (?:sin|vår)e?(?:$| (?!egen|egne))
yang melakukan trik untuk kebutuhan saya. Hanya menyediakan ini sebagai skenario "dunia nyata" yang lain. Lihat tautan((?!unsigned ).{9}|^.{0,8})int
Jika Anda dapat melihat ke depan tetapi ke belakang, Anda dapat membalik string terlebih dahulu dan kemudian melakukan lookahead. Beberapa pekerjaan lagi perlu dilakukan, tentu saja.
sumber
Ini adalah solusi yang setara dengan jawaban Tim Pietzcker (lihat juga komentar dari jawaban yang sama):
Artinya, cocok
*.js
kecuali*filename.js
.Untuk mendapatkan solusi ini, Anda dapat memeriksa pola mana yang tidak termasuk dalam tampilan negatif, dan kemudian mengecualikan pola-pola ini dengan tampilan yang negatif.
sumber
Di bawah ini adalah tampilan positif di balik alternatif JavaScript yang menunjukkan cara menangkap nama belakang orang dengan 'Michael' sebagai nama depan mereka.
1) Diberikan teks ini:
dapatkan berbagai nama belakang orang yang bernama Michael. Hasilnya harus:
["Jordan","Johnson","Green","Wood"]
2) Solusi:
3) Periksa solusinya
Demo di sini: http://codepen.io/PiotrBerebecki/pen/GjwRoo
Anda juga dapat mencobanya dengan menjalankan cuplikan di bawah ini.
sumber