Bir kelimeyi / dizeyi hariç tutmak için normal ifade


299

Aşağıdaki gibi düzenli bir ifade var:

^/[a-z0-9]+$

Bu, /helloveya gibi dizelerle eşleşir /hello123.

Ancak, /ignoremeve gibi dize değerlerini bir çift hariç tutmak istiyorum /ignoreme2.

Birkaç varyant denedim ama işe yarayamadım!

En son zayıf girişimim

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

Herhangi bir yardım minnetle takdir edilecektir :-)


Yanıtlar:


377

İşte başka bir yol ( olumsuz bir ileriye bakma kullanarak ):

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

Not: Yalnızca bir yakalama ifade var: ([a-z0-9]+).


1
Harika, bu hile yapmış gibi görünüyor. Aslında url yeniden yazma için bu kurala ihtiyacım var ve "images", "css" ve "js" klasörünü yoksaymak istedim. Yani kuralım şöyledir: ^ / (?! css | js | images) ([az] +) /? (\? (. +))? $ Ve /Profile.aspx?id=$1&$3 Bu kural düzgün çalışır ve sorgu dizesini de yayar mı? Yani birisi ziyaretleri eğer mydomain.com/hello?abc=123 ben yeniden yazmak seveceğini mydomain.com/Profile.aspx?id=hello&abc=123 Ben de performansı hakkında biraz emin değilim (. +) At orijinal istekte sorgu dizesini yakalamak için son.
Romiem

Bu başka bir soru gibi geliyor. Sahip olduğunuz normal ifade sorgu dizesini yakalar - test ve sorgu dizenizin gelip gelmediğini görün. Ayrıca - (\?(.+))?$hızlı olmalı. Hız konusunda fazla endişelenmezdim.
Seth

1
Bu benim için işe yaramadı, Alix Axel'nin çözümü işe yaradı. Java'nın java.util.regex.Patternsınıfını kullanıyorum .
Mark Jeronimus

1
Mark'ın işaretini onaylıyorum;) - örneğin, Pycharm Java tabanlı, değil mi? Yani, Pycharm search Alix'in çözümündeki düzenli ifadeler göz önüne alındığında, diğeri işe yaramaz.
fanny

43

Bunu yapmalı:

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

İstediğiniz kadar yok sayılan sözcükler ekleyebilirsiniz, basit bir PHP uygulaması:

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

preg_match('~^/\b([a-z0-9]+)\b(?<!' . implode('|', array_map('preg_quote', $ignoredWords)) . ')~i', $string);

Ben arkasına bakmak bir sabit genişlik desen gerektirir düşündüm?
Simon

2
@AlixAxel Öyle, ama daha akıllı regex kütüphaneleri alternatifler için farklı uzunluklarda bir değişime izin verecek (ve en uzununu kullanacak), her alternatif sabit uzunlukta olduğu sürece.
ChrisF

bu akıllıdır, ancak yok sayılan sözcük başka bir kelimenin sonundaysa benim için başarısız olur. yani 'a' değerini yok sayılan sözcüklerden biri olarak eklerseniz, a ile biten herhangi bir sözcük yok sayılır
singmotor

21

Her iki kelimeyi de hariç tutmak istediğinizde, bir konuya ihtiyacınız vardır:

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

Şimdi bir eşleşme için her iki koşul da doğru olmalıdır (ne ignoreme ne de ignoreme2'ye izin verilmez).


1
Bu, bir dizi alternatifin negatif bir gözü olan yukarıdaki kısa olana eşdeğerdir.
ChrisF

4
@ChrisF Hayır, pek değil. Seth'in çözüm gibi bir şey maç olmaz /ignoremenotolarak /takip eder ignoreme.
Gumbo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.