Ekspresi reguler untuk mengecualikan kata / string

299

Saya memiliki ekspresi reguler sebagai berikut:

^/[a-z0-9]+$

Ini cocok dengan string seperti /helloatau /hello123.

Namun, saya ingin mengecualikan beberapa nilai string seperti /ignoremedan /ignoreme2.

Saya sudah mencoba beberapa varian tetapi sepertinya tidak dapat membuatnya bekerja!

Upaya lemah terakhir saya adalah

^/(((?!ignoreme)|(?!ignoreme2))[a-z0-9])+$

Setiap bantuan akan sangat dihargai :-)

romiem
sumber
1
Kemungkinan rangkap: stackoverflow.com/questions/1395177/…
Anderson Green

Jawaban:

376

Inilah cara lain (menggunakan pandangan negatif ke depan ):

^/(?!ignoreme|ignoreme2|ignoremeN)([a-z0-9]+)$ 

Catatan: Hanya ada satu ungkapan menangkap: ([a-z0-9]+).

Seth
sumber
1
Cemerlang, yang tampaknya telah melakukan trik. Saya sebenarnya memerlukan aturan ini untuk menulis ulang url dan saya ingin mengabaikan folder "gambar", "css" dan "js". Jadi aturan saya adalah sebagai berikut: ^ / (?! css | js | images) ([az] +) /? (\? (. +)) $ Dan itu ditulis ulang ke /Profile.aspx?id=$1&$3 Apakah aturan ini akan berfungsi dengan benar dan menyebarkan string kueri juga? Jadi, jika seseorang mengunjungi mydomain.com/hello?abc=123 Saya ingin menulis ulang ke mydomain.com/Profile.aspx?id=hello&abc=123 Saya juga agak tidak yakin tentang kinerja (. +) Di akhir untuk menangkap querystring dalam permintaan awal.
romiem
Kedengarannya seperti ini adalah pertanyaan lain. Regexp yang Anda miliki sepertinya akan menangkap string kueri - uji dan lihat apakah string kueri Anda muncul. Juga - (\?(.+))?$harus cepat. Saya tidak akan terlalu khawatir tentang kecepatan.
Seth
1
Ini tidak berhasil untuk saya, sementara solusi Alix Axel berhasil. Saya menggunakan java.util.regex.Patternkelas Java .
Mark Jeronimus
1
Saya mengkonfirmasi tanda Mark;) - misalnya, Pycharm berbasis Java, bukan? Jadi, mengingat regex dalam pencarian Pycharm, solusi Alix bekerja, yang lain tidak.
fanny
43

Ini harus dilakukan:

^/\b([a-z0-9]+)\b(?<!ignoreme|ignoreme2|ignoreme3)

Anda dapat menambahkan kata-kata yang diabaikan sebanyak yang Anda suka, di sini adalah implementasi PHP sederhana:

$ignoredWords = array('ignoreme', 'ignoreme2', 'ignoreme...');

preg_match('~^/\b([a-z0-9]+)\b(?<!' . implode('|', array_map('preg_quote', $ignoredWords)) . ')~i', $string);
Alix Axel
sumber
saya pikir melihat ke belakang membutuhkan pola lebar tetap?
simon
2
@AlixAxel melakukannya, tetapi lib regex yang lebih pintar akan memungkinkan pergantian dengan panjang yang berbeda untuk alternatif (dan menggunakan yang terpanjang), selama setiap alternatif memiliki panjang yang tetap.
ChrisF
ini cerdas, tetapi gagal bagi saya jika kata yang diabaikan ada di akhir kata lain. yaitu jika Anda menambahkan 'a' sebagai salah satu dari kata-kata yang diabaikan, maka setiap kata yang diakhiri dengan a diabaikan
singmotor
21

Karena Anda ingin mengecualikan kedua kata, Anda perlu kata penghubung:

^/(?!ignoreme$)(?!ignoreme2$)[a-z0-9]+$

Sekarang kedua kondisi harus benar (baik ignoreme atau ignoreme2 tidak diizinkan) untuk memiliki kecocokan.

Gumbo
sumber
1
Ini setara dengan yang lebih pendek di atas yang merupakan tampilan negatif dari serangkaian alternatif.
ChrisF
4
@ ChrisF Tidak, tidak juga. Solusi Seth tidak akan cocok dengan sesuatu seperti /ignoremenotyang /diikuti oleh ignoreme.
Gumbo