2015-02-02 12 views
8

क्या एक regex में तार की एक सरणी का अनुवाद और फिर प्राप्त करने के लिए अलग-अलग तारों पर regex कई बार उपयोग करने के लिए सबसे संक्षिप्त और कारगर तरीका है परिणाम मेल खाता है और फिर उन पर फिर से शुरू होता है? अब मैं उपयोग कर रहा हूँ निम्नलिखित:परिवर्तित सरणी regex और इसका इस्तेमाल एक स्ट्रिंग के मैच में प्राप्त करने के लिए करने के लिए

var myArray = ['peaches', 'bananas', 'papaya', 'supercity']; 
var myString = 'I want some papaya and some peaches'; 

var regexFromMyArray = new RegExp(myArray.toString().replace(/,/g, '|'), 'gi'); 

var matches = myString.match(regexFromMyArray) || []; 

if (matches.length) { 
    for (var i = 0, l = matches.length; i < l; i++) { 
    console.log('Found: ' + matches[i]); 
    } 
} 

प्रदर्शन यहाँ महत्वपूर्ण है, इसलिए सादा जावास्क्रिप्ट करें।

उत्तर

14

बस, पाइप लाइन के साथ शामिल होने के Array.join

var regexFromMyArray = new RegExp(myArray.join("|"), 'gi'); 

का उपयोग करने और बस के रूप में if हालत सिर्फ अनावश्यक है यह करते हैं।

for(var i = 0; i < matches.length; i++) 
    console.log("Found:", matches[i]); 
  1. एक एकल विधि प्रारंभिक 3. के स्थान पर प्रयोग किया जा रहा है (toString आंतरिक join(",") कॉल) और replace समारोह भी नहीं किया जाता है।
  2. हम एक अनावश्यक अगर शर्त को हटा दिया है। तो यह बहुत तेज़ है।

और चूंकि आप regexes के बारे में बात करते हैं, मैं कहना है

  1. कि एक एकल regex आरंभीकरण आप ज्यादा खर्च करने के लिए नहीं जा रहा है करना चाहते हैं।
  2. अपने उद्देश्य वास्तव में सरणी में शब्द का मिलान कर, तो बस String.indexOf, जो एक ही हल के लिए एक गैर regex रूप है के साथ जाना है।
+1

ठीक है, मुझे लगता है कि आप वास्तव में मामले में इनपुट तार वे विशेष regexp वर्ण हो से बचने के लिए की जरूरत का उल्लेख करना चाहिए। इसके अलावा, यदि ओपी प्रदर्शन के बारे में बहुत चिंतित है, तो उसे रेगेक्सपी बनाने की एक-बार लागत के बारे में कम चिंता होनी चाहिए, और वास्तविक मिलान प्रदर्शन के बारे में अधिक चिंतित होना चाहिए। उस परिप्रेक्ष्य से, क्या आप प्रत्येक स्ट्रिंग को अलग-अलग जांचने के दृष्टिकोण की तुलना में रेगेक्सप्स के प्रदर्शन पर विचार कर सकते हैं? –

+0

@torazaburo मैं निश्चित रूप से चाहता हूँ। कि दृष्टिकोण से * रखकर आप regexps के प्रदर्शन पर विचार कर सकता है सिर्फ व्यक्तिगत रूप से प्रत्येक स्ट्रिंग की जाँच के दृष्टिकोण की तुलना में? * यदि आप अर्थ कर रहे हैं 'indexOf'? –

+0

सामान्य रूप से, अच्छा उत्तर सरणी के आकार पर निर्भर करता है ... मैंने आपके दोनों स्रोतों के साथ jsperf बनाया और indexOf के साथ मेरा कार्यान्वयन किया [http://jsperf.com/match-on-string-an-array -संभावनाएं) ... बेहतर प्रतीत होता है। –

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