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.