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 :-)


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]+).


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);

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.


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.