2009-12-01 14 views
5

मुझे regex के साथ समस्या है। मुझे निर्दिष्ट शब्दों के एक सेट के अपवाद के साथ रेगेक्स बनाने की आवश्यकता है, उदाहरण के लिए: सेब, नारंगी, रस। और इन शब्दों को देखते हुए, यह ऊपर दिए गए शब्दों को छोड़कर सबकुछ से मेल खाएगा।विशेष शब्दों के अपवाद के साथ Regex

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) 
+0

आप किस भाषा के साथ काम कर रहे हैं? "नारंगी का रस" मैच भी होना चाहिए, या असफल हो? – gnarf

उत्तर

-1

कुछ (पीएचपी)

$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

सिवाय इसके कि 'सेबजूइस' से मेल खाएगा और इसलिए सत्यापन त्रुटि फेंक दी जाएगी। – gnarf

7

तुम सच में एक भी नियमित अभिव्यक्ति के साथ ऐसा करना चाहते हैं, तो आप lookaround सहायक (इस उदाहरण में विशेष रूप से नकारात्मक अग्रदर्शी) मिल सकती है की तरह। (कुछ कार्यान्वयन lookarounds के लिए अलग अलग वाक्य रचना है) रूबी के लिए लिखा regex:

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

लगता है कि आपका शब्द चरित्र के रूप में हाइफन का इलाज करना चाहते हैं।

3

मैंने देखा कि apple-juice आपके पैरामीटर के अनुसार मेल खाना चाहिए, लेकिन apple juice के बारे में क्या चाहिए? मुझे लगता है कि यदि आप apple juice मान्य कर रहे हैं तो भी आप इसे विफल करना चाहते हैं।

/[^-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. 

सबसे regexp जायके एक "शब्द सीमा" लेकिन के "शब्द अक्षरों" मानक सूची के रूप में गिना जाता है \b नहीं करता है में ': -

तो है कि एक "सीमा" के रूप में गिना पात्रों का एक सेट का निर्माण करने देता टी - शामिल हैं ताकि आपको एक कस्टम बनाने की आवश्यकता हो। यह /\b(apple|orange|juice)\b/ साथ मेल खा सकते हैं अगर आप - रूप में अच्छी तरह पकड़ने की कोशिश कर नहीं कर रहे थे ...

आप केवल 'एक शब्द' परीक्षण परीक्षण कर रहे हैं, तो आप एक बहुत सरल के साथ जा सकते हैं:

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

यह हो जाता है वहाँ जिस तरह से कुछ:

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

एक पूरी स्ट्रिंग के मिलान होगा जब तक कि यह केवल मना शब्दों में से एक के होते हैं।

वैकल्पिक रूप से, आप रूबी उपयोग कर रहे हैं नहीं या आप सुनिश्चित करें कि आपके तार कोई पंक्ति विराम को शामिल कर रहे हैं या आप विकल्प की स्थापना की है कि ^ और $ पर लाइनों की शुरुआत/समाप्त होता है से मेल नहीं खाते

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

भी काम करेगा।

संबंधित मुद्दे