2013-02-13 10 views
6

मैं रेगेक्स में बेहतर हो रहा हूं, लेकिन मैं कुछ ऐसा कर चुका हूं जो मैं वर्तमान में करने में सक्षम हूं।अंत में संभव विराम चिह्न या बहुवचन के साथ एकल शब्द मिलान करें (रेगेक्स)

मैं स्ट्रिंग के अंदर कोई शब्द पाया जाता है या नहीं, यह देखने के लिए परीक्षण (सत्य या गलत लौटा) परीक्षण करने के लिए एक फ़ंक्शन बनाना चाहता हूं। लेकिन अगर कोई शब्द दूसरे शब्द के अंदर पाया गया तो मैं सकारात्मक मिलान नहीं करना चाहता। मैं बहुवचन की जांच की संभावना में भी निर्माण करना चाहता हूं।

पद के लिए देखने के लिए:

यहाँ परिणामों के कुछ उदाहरण मैं पाने के लिए उम्मीद थी हैं "बार"

// क्या यह के रूप में वापस आ जाएगी "में खोज करने के लिए स्ट्रिंग्स"

"foo बार" // सच

"foo बार।" // सच

"foo bar!" // सच ('बार' से पहले या बाद में किसी अन्य विराम चिह्न के साथ भी सच होगा)

"foo bars।" // सच

"foo bares।" // सच (भले ही बर्स के पास एक अलग अर्थ है, फिर भी, मैं इस वापसी के साथ ठीक रहूंगा क्योंकि मुझे "es" के साथ बहुल करने वाले शब्दों की जांच करने की आवश्यकता होगी और मैं यह जानने के लिए रेगेक्स बनाने की अपेक्षा नहीं करूंगा कि कौन से शब्द "एस" और जो करने के लिए "es")

साथ pluralize "मेरा नाम बार्ट सिम्पसन है" // झूठी (बार वास्तव में "बार्ट" का हिस्सा है)

"बार्ट सिम्पसन बार के लिए गया था।" // सच

मैं मैचों

धन्यवाद मदद के लिए बहुत बहुत के लिए जाँच करने के लिए उपयोग किया जाएगा जावास्क्रिप्ट/jQuery!

+0

तो "बच्चे" से "बच्चे" से मेल खाने की उम्मीद नहीं है, सही? –

+0

हां, मैं "बच्चे" से मेल खाने की अपेक्षा नहीं करता हूं। – rgbflawed

+4

नियमित अभिव्यक्तियों के साथ बहुवचन करना आसान नहीं है। _mouse/mice_ और _colossus/colossi_ के बारे में क्या? – Halcyon

उत्तर

4
var rgx = new RegExp('\\b' + word + '(?:es|s)?\\b'); 
rgx.test(string); 

यह तार आप अपने अनुरोध में निर्दिष्ट के सभी के लिए true वापस आ जाएगी। \b "शब्द सीमा" का प्रतिनिधित्व करता है, जो मुझे लगता है कि \W (अवधि और विस्मयादिबोधक बिंदु सहित) में स्ट्रिंग के प्रारंभ या अंत में कोई भी चरित्र है।

+0

यह बहुत अच्छा काम करता है! इसे काम करने के लिए बस एक बदलाव करना पड़ा। "रेगेक्स" को "RegExp" में बदल दिया गया। बहुत बहुत धन्यवाद ईपी! – rgbflawed

+0

@StevenJenkins ओह, मैं अपने सभी परीक्षणों में 'RegExp' का उपयोग कर रहा था, लेकिन मैंने पहले जवाब में 'Regex' लिखा था। –

0
/ (bar((e)?s)?)[ !?.]/ 

आपको जिस चीज की आवश्यकता है उसके आधार पर यह काम कर सकता है। ओवरलैपिंग रिक्त स्थान की वजह से इसे "बार बार" स्ट्रिंग में दो बार नहीं मिलेगा।

/ (bar((e)?s)?)(?=[ !?.])/ 

कि के साथ "सलाखों सलाखों" (दो मैच) js1.5 के बाद से जो वैसे भी आजकल सभी ब्राउज़रों द्वारा समर्थित है काम करना चाहिए।

2

यह पहले से ही उत्तर दिया गया है और स्वीकार किया गया है, लेकिन मैंने सोचा कि मैं थोड़ा ओवर-इंजीनियर दृष्टिकोण प्रदान करता हूं जो बहुवचन रूपों से मेल खाने का बेहतर काम करता है।उसके अलावा, यह @ExplosionPills 'समाधान के रूप में बिल्कुल एक ही तर्क का उपयोग करता:

(function() { 
    var isWord = function(word) { return /^[a-z]+$/i.test(word); }, 

     exceptions = { 
     man: 'men', 
     woman: 'women', 
     child: 'children', 
     mouse: 'mice', 
     tooth: 'teeth', 
     goose: 'geese', 
     foot: 'feet', 
     ox: 'oxen' 
     }, 

     pluralise = function(word) { 
     word = word.toLowerCase(); 

     if (word in exceptions) { 
      // Exceptions 
      return '(?:' + word + '|' + exceptions[word] + ')'; 

     } else if (word.match(/(?:x|s|[cs]h)$/)) { 
      // Sibilants 
      return word + '(?:es)?'; 

     } else if (word.match(/[^f]f$/)) { 
      // Non-Geminate Labio-Dental Fricative (-f > -ves/-fs) 
      return '(?:' + word + 's?|' + word.replace(/f$/, 'ves') + ')'; 

     } else if (word.match(/[^aeiou]y$/)) { 
      // Close-Front Unround Pure Vowel (-Cy > -Cies) 
      return '(?:' + word + '|' + word.replace(/y$/, 'ies') + ')'; 

     } else if (word.substr(-1) == 'o') { 
      // Mid-Back Round Vowel (-o > -oes/-os) 
      return word + '(?:e?s)?'; 

     } else { 
      // Otherwise 
      return word + 's?'; 
     } 
     }; 

    String.prototype.containsNoun = function(singularNoun) { 
    if (!isWord(singularNoun)) throw new TypeError('Invalid word'); 
    var check = new RegExp('\\b' + pluralise(singularNoun) + '\\b', 'gi'); 
    return check.test(this); 
    }; 

    String.prototype.pluralException = function(plural) { 
    if (!isWord(this) || !isWord(plural)) throw new TypeError('Invalid exception'); 

    var singular = this.toLowerCase(); 
    plural = plural.toLowerCase(); 

    if (!(singular in exceptions)) { 
     exceptions[singular] = plural; 
    } 
    }; 
})(); 

यह देशी String वस्तु फैली हुई है, तो आप इसे इतना की तरह उपयोग करें:

'Are there some foos in here?'.containsNoun('foo'); // True 

कुछ quick- के लिए the gist देखें और गंदे इकाई परीक्षण नोड.जे.एस. में किया गया