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.