2009-05-14 17 views
6

मेरे पास एक वाक्य है, और मैं इससे कुछ शब्द निकालना चाहता हूं।RegExp: मैं वाक्य में अनावश्यक शब्दों को हटाना चाहता हूं। मैं यह कैसे कर सकता हूं?

तो अगर मेरे पास है:

"jQuery is a Unique language" 

और एक सरणी कि garbageStrings नाम है:

var garbageStrings = ['of', 'the', "in", "on", "at", "to", "a", "is"]; 

मैं "है" और "एक" वाक्य में निकालना चाहते हैं।

लेकिन अगर मैं इसका उपयोग करता हूं:/यह कथन लूप के अंदर है। मैं पूरे वाक्य पाशन कर रहा हूँ और garbageStrings में एक मैच/

var regexp = new RegExp(garbageStrings[i]); 

स्ट्रिंग हो जाएगा "jQuery अनोखा lnguge"

सूचना है कि "एक" भाषा में वाक्य से निकाल दिया जाता खोजने।

मुझे ऐसा करने का इरादा नहीं था।

+0

@ चास: मैं समझता हूं कि प्रस्तुत वाक्यविन्यास और Regexp ऑब्जेक्ट जावास्क्रिप्ट के निहित हैं, लेकिन मुझे अभी भी लगता है कि भाषा टैग को बदलने के लिए यह अजीब है क्योंकि ओपी ने इसे पूरी तरह से जिक्र करने से बचा है। – Cerebrus

+1

@ केइरा: +1 सिर्फ इसलिए कि आपका नाम मुझे हंसता है! – Cerebrus

+0

@ सेरेब्रस यदि यह गलत है तो ओपी इसे वापस बदल सकता है, लेकिन यह एक बड़े दर्शकों के लिए प्रश्न पूछता है। यदि इसे भाषा अज्ञेयवादी होने की आवश्यकता है तो ओपी को इसे भाषा-अज्ञेयवादी चिह्नित करना चाहिए था। –

उत्तर

4

मैं शपथ ली हो सकता था जावास्क्रिप्ट \b (शब्द सीमा) था, लेकिन ऐसा लगता है कि यह नहीं हैं, तब यह कोशिश करता है:,

var regex = new RegExp("(|^)" + "a" + "(|$)", "g"); 
var string = "I saw a big cat, it had a tail."; 

string = string.replace(regex, "$1$2"); 
+0

मैंने कोशिश की लेकिन काम नहीं किया –

3

पहले अगर आप प्रत्येक संभव प्रकार के माध्यम से लूप करने के लिए जा रहे हैं "garbageString" का, यह Regex का उपयोग करने के लिए पूरी तरह से अनावश्यक है।

दूसरा, आपको शायद "केवल पूरे शब्द" खोजने की कोशिश करनी चाहिए। इसका मतलब यह होगा कि आप कचरा स्ट्रिंग से मेल खाते हैं, अगर यह पहले होता है और उसके बाद शब्द डिलिमिटर (जैसे कि आपके उदाहरण में व्हाइटस्पेस) होता है। यदि आप इसे कार्यान्वित करते हैं, तो रेगेक्स आधारित मिलान उपयोगी हो जाता है।

यदि कोई विराम चिह्न चिह्न हैं, तो यह कोड काम नहीं करता है, लेकिन आपकी आवश्यकताओं के अनुसार कोड को बदलने में बहुत मुश्किल नहीं होनी चाहिए।

var text = "jQuery is a Unique language"; 
var garbageStrings = {"of": true, 
         "the": true, 
         "in": true, 
         "on": true, 
         "at": true, 
         "to": true, 
         "a": true, 
         "is": true}; 

var words = text.split(" "); 
var newWords = Array() 
for (var i = 0; i < words.length; i++) { 
    if (typeof(garbageStrings[words[i]]) == "undefined") { 
     newWords.push(words[i]); 
    } 
} 
text = newWords.join(" "); 
+0

@gs: संपादन के लिए धन्यवाद! :-) – Cerebrus

12

कुछ इस तरह:

function keyword(s) { 
    var words = ['of', 'the', 'in', 'on', 'at', 'to', 'a', 'is']; 
    var re = new RegExp('\\b(' + words.join('|') + ')\\b', 'g'); 
    return (s || '').replace(re, '').replace(/[ ]{2,}/, ' '); 
} 
+3

+1, लेकिन मैं उन सभी शब्दों को पठनीयता के लिए सरणी में डाल दूंगा, और फिर इसे rejx में रखने के लिए .join ('|') का उपयोग करें। – nickf

+0

निश्चित रूप से। निचोड़ regex भी परिष्कृत। – wombleton

+1

ध्यान दें कि न केवल रिक्त स्थान शब्द सीमाएं हैं बल्कि '\ W' कक्षा में कोई भी वर्ण हैं। तो भी hyphens। – Gumbo

0

सबसे पहले, आप इस के लिए सरणियों का उपयोग करने की जरूरत है, regex नहीं है, क्योंकि वे तेजी से हो जाएगा। रेगेक्स परिमाण के आदेश अधिक जटिल है, और इस प्रकार बहुत भारी है। जैसा कि एटवुड कहते हैं, एक प्रोग्रामर सोचता है कि वह एक रेगेक्स के साथ एक समस्या को हल कर सकता है। फिर उसके पास दो समस्याएं हैं।

तो, एक त्वरित कार्यान्वयन जो आपकी कचरा तारों की सूची का उपयोग करता है, और नौकरी करता है, यह जांचने के लिए जावास्क्रिप्ट की अंतर्निहित शब्दकोश गति का शोषण करता है कि कोई शब्द कचरा है या नहीं, और विराम चिह्न के लिए हैंडलिंग के साथ नीचे दिया गया है। a little test page है आप इसे आजमा सकते हैं।

function splitwords(str) { 
    var unpunctuated = unpunctuate(str); 
    var splitted = unpunctuated.split(" "); 
    return splitted; 
} 

function unpunctuate(str) { 
    var punctuation = ['.', ',', ';', ':', '-']; 
    var unpunctuated = str; 
    for(punctidx in punctuation) { 
    punct = punctuation[punctidx]; 
    // this line removes punctuation. to keep it, swap in the line below. 
    //unpunctuated = unpunctuated.replace(punct," "+punct+" "); 
    unpunctuated = unpunctuated.replace(punct,""); 
    } 
    return unpunctuated; 
} 


var garbageStrings = ['of', 'the', "in", "on", "at", "to", "a", "is"]; 

var garbagedict= {}; 

for(garbstr in garbageStrings) { 
    garbagedict[garbageStrings[garbstr]] = 1; 
} 

function remove(str) { 
    words = splitwords(str); 
    keeps = []; 
    for(wordidx in words) { 
    word = words[wordidx]; 
    if(word in garbagedict) { 
     // ignore 
    } else { 
     keeps.push(word); 
    } 
    } 
    return keeps.join(" "); 
} 
+0

एटवुड उस उद्धरण के साथ नहीं आया था, न कि करीब भी। http://en.wikipedia.org/wiki/Jamie_Zawinski –

+0

एटवुड रेगेक्स, wtf प्यार करता है? अगर मैं इसे स्रोत में देखता हूं तो मैं उस कोड को एक सेकंड में हटा दूंगा। –

+0

@ चाड: तो कुछ बेहतर प्रदान करें। @ पाउलो: मैंने इसे एटवुड से सुना, और यह उद्धरण नहीं है। इस कोड का मुद्दा यह है कि यह ओपी क्या करना चाहता है। रेगेक्स पैटर्न मिलान के लिए बहुत अच्छा है, लेकिन यह पैटर्न मिलान नहीं है। यह सरल शब्द तुलना है। सरल यहाँ निश्चित रूप से बेहतर है। –

0

कृपया, इस के लिए रेगुलर एक्सप्रेशन का उपयोग नहीं करते हैं, यह गंदा और अनावश्यक है, और भी कई चक्र लेता है। आसान:

var garbageStrings = ['of', 'the', "in", "on", "at", "to", "a", "is"]; 
for(var i=0; i < garbageString.length; i++){ 
    string.replace(" "+garbageStrings[i]+" ", ""); 
} 

या का उपयोग कर सरणियों:

var garbageStrings = ['of', 'the', "in", "on", "at", "to", "a", "is"]; 
var str = str.split(" "); 
for(var i=0; i < garbageStrings.length; i++){ 
    for(var j=0; j < str.length; j++){ 
     if(str[j].toLowerCase() === garbageStrings[i]){ 
      str.splice(j, 1); 
     } 
    } 
} 
str = str.join(" "); 
0

wombleton की तरह कहा।;)

सिवाय मैं regex खुद के हिस्से के रूप सफेद स्थान को निकालना चाहते हैं, न कि इस (बेहतर प्रदर्शन के लिए) के लिए एक दूसरे regex का उपयोग:

var re = new RegExp("\\b(?:"+ words.join("|") + ")\\b\\s*", "gi"); 
s.replace(re, ""); 

regex वस्तु निर्माण पर संकलित किया जाएगा। दोहराए गए परिचालनों पर यह स्ट्रिंग/सरणी ऑपरेशन के साथ प्रत्येक स्टॉपवर्ड के माध्यम से लूपिंग से काफी धीमा नहीं होना चाहिए, और इसे समझना बहुत आसान है।

तुम सिर्फ stopwords की एक छोटी, स्थिर सूची है, तो आप के बजाय अपने खुद के अनुकूलित regex लिख सकते हैं:

var re = new RegExp("\\b(?:at?|i[ns]|o[fn]|t(?:he|o))\\b\\s*", "gi"); 
"jQuery is a Unique language".replace(re, ""); 

विचार यहाँ है कि "" की "और एक ही उपसर्ग साझा करने शब्द (जैसे ") उसी निष्पादन पथ को तब तक साझा करें जब तक वे भिन्न न हों। आपके मामले में शायद ही जरूरी है, लेकिन इसके बारे में जानना अच्छा है।

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