2009-12-01 13 views
5

Regex ile ilgili bir sorunum var. Belirli bir kelime grubu istisnası dışında normal ifadeler kullanmam gerekiyor, örneğin: elma, portakal, meyve suyu. ve bu kelimeler verildi, yukarıdaki sözcükler dışındaki her şeyle eşleşir. Eğer gerçekten tek bir normal ifade ile bunu yapmak isterseniz, etrafa bakma yararlı (bu örnekte özellikle negatif ileri yönlü) bulabilirsinizBelirli kelimeler istisnası ile normal ifade

$input = "The orange apple gave juice"; 
if(preg_match("your regex for validating") && !preg_match("/apple|orange|juice/", $input)) 
{ 
    // it's ok; 
} 
else 
{ 
    //throw validation error 
} 
+0

Hangi dille çalışıyorsunuz? Ayrıca "portakal suyu" eşleşmeli mi, yoksa başarısız mı? – gnarf

cevap

-1

şey. (Bazı uygulamaları lookarounds için farklı bir sözdizimi var) Ruby için yazılı Regex: Bir kelime karakteri olarak tire tedavi etmek istiyorum gibi

rx = /^(?!apple$|orange$|juice$)/ 
+0

Bunun dışında "applejuice" eşleşecek ve bu nedenle bir doğrulama hatası atar. – gnarf

7

(PHP) gibi

apple (should not match) 
applejuice (match) 
yummyjuice (match) 
yummy-apple-juice (match) 
orangeapplejuice (match) 
orange (should not match) 
juice (should not match) 
orange-apple-juice (match) 
apple-orange-aple (match) 
juice-juice-juice (match) 
orange-juice (match) 
3

apple-juice'un parametrelerinize göre eşleşmesi gerektiğini fark ettim, ama ne hakkında apple juice? apple juice'u doğrularsanız hala başarısız olmasını istersiniz. Bir "kelimesi sınır" ama "kelimesi karakterlerin" standart liste olarak \b sayımları doesn en regexp'in tatlar ise

/[^-a-z0-9A-Z_]/  // Will match any character that is <NOT> - _ or 
         // between a-z 0-9 A-Z 

/(?:^|[^-a-z0-9A-Z_])/ // Matches the beginning of the string, or one of those 
         // non-word characters. 

/(?:[^-a-z0-9A-Z_]|$)/ // Matches a non-word or the end of string 

/(?:^|[^-a-z0-9A-Z_])(apple|orange|juice)(?:[^-a-z0-9A-Z_]|$)/ 
    // This should >match< apple/orange/juice ONLY when not preceded/followed by another 
    // 'non-word' character just negate the result of the test to obtain your desired 
    // result. 

': -

Yani bir "sınır" olarak saymak bir karakter kümesi oluşturmak sağlar -'u dahil edin, böylece özel bir tane oluşturmanız gerekir. siz de - yakalamaya çalışırken olmasaydı sadece 'tek kelime' testleri test ediyorsanız Size daha basit ile gidebilirsiniz

... /\b(apple|orange|juice)\b/ ile eşleşebilir:

/^(apple|orange|juice)$/ // and take the negation of this... 
0

Bu alır orada bazı yol: sadece yasak kelimeleri birinin oluşur sürece

((?:apple|orange|juice)\S)|(\S(?:apple|orange|juice))|(\S(?:apple|orange|juice)\S) 
0
\A(?!apple\Z|juice\Z|orange\Z).*\Z 

bütün bir dize eşleşir.

Alternatif ^ ve $ hatlarının başlangıçlar/ucunda eşleşmeyen Ruby'yi kullanmadığınız ya da dizeleri hiçbir satır sonları içerdiğinden emin değilseniz veya seçeneği kurduysanız

^(?!apple$|juice$|orange$).*$ 

da işe yarayacak.