2009-05-14 6 views
6

Ho una frase e desidero rimuovere alcune parole da essa.RegExp: voglio rimuovere le parole non necessarie nella frase. Come posso farlo?

Quindi, se ho:

"jQuery is a Unique language" 

e una serie che è denominato garbageStrings:

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

voglio togliere la "è" e "a" nella frase.

Ma se lo uso:/Questa istruzione è all'interno di un ciclo for. Sto looping l'intera frase e trovare una corrispondenza nelle garbageStrings/

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

la stringa diventerà "jQuery unico lnguge"

Si noti che la "a" in lingua viene rimosso dalla frase.

Non intendevo che ciò accadesse.

+0

@Chas: Capisco che la sintassi presentata e l'oggetto Regexp siano inerenti a Javascript, ma continuo a pensare che sia presuntuoso modificare il tag della lingua poiché l'OP ha evitato di menzionarlo completamente. – Cerebrus

+1

@Keira: +1 solo perché il tuo nome mi fa ridere! – Cerebrus

+0

@Cerebrus Se è sbagliato, l'OP può cambiarlo di nuovo, ma questo porta la domanda ad un pubblico più ampio. Se ha bisogno di essere indipendente dal linguaggio, l'OP dovrebbe averlo contrassegnato come indipendente dalla lingua. –

risposta

4

avrei giurato JavaScript aveva \b (confine di parola), ma sembra che non lo fa, provate questo invece:

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

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

Ho provato a farlo ma non ho funzionato –

3

In primo luogo, se si sta andando ad avere per ciclo attraverso ogni tipo di possibile di "garbageString", non è assolutamente necessario utilizzare Regex.

In secondo luogo, probabilmente dovresti cercare di cercare "solo parole intere". Ciò significherebbe che si abbina una stringa di garbage solo se è preceduta e seguita da un delimitatore di parole (come spazi bianchi nell'esempio). Se lo implementi, diventa utile una partita basata su Regex.

Questo codice non funziona, se sono presenti segni di punteggiatura, ma non dovrebbe essere troppo difficile modificare il codice in base alle proprie esigenze.

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: Grazie per la modifica! :-) – Cerebrus

12

Qualcosa di simile a questo:

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, ma inserisco tutte le parole in un array per la leggibilità e quindi uso .join ('|') su di esso per inserirlo nell'espressione regolare. – nickf

+0

Sicuro. Anche perfezionato la regex di compressione. – wombleton

+1

Si noti che non solo gli spazi sono limiti di parole ma qualsiasi carattere nella classe '\ W'. Quindi anche i trattini. – Gumbo

0

In primo luogo, è necessario utilizzare le matrici per questo, non regex, perché sarà più veloce. Il regex è un ordine di grandezza più complesso e quindi troppo pesante. Come dice Atwood, un programmatore pensa di poter risolvere un problema con una regex. Quindi ha due problemi.

Quindi, un'implementazione rapida che utilizza l'elenco di stringhe garbage, e fa il lavoro, sfruttando la velocità del dizionario incorporata di javascript per controllare se una parola è spazzatura o meno, e con la gestione per la punteggiatura è riportata di seguito. C'è lo a little test page su cui puoi provarlo.

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

Atwood non ha inventato quella citazione, nemmeno vicino. http://en.wikipedia.org/wiki/Jamie_Zawinski –

+0

Atwood ama Regex, wtf? Cancellerei quel codice in un secondo se lo vedessi nella fonte. –

+0

@Chad: Quindi offri qualcosa di meglio. @Paulo: l'ho sentito da Atwood e non è una citazione. Il punto di questo codice è che fa ciò che l'OP vuole fare. Regex è ottimo per la corrispondenza dei pattern, ma non si tratta di pattern matching. È un semplice paragone di parole. Semplice è decisamente meglio qui. –

0

Per favore, non usare RegExp per questo, è sporco e non necessario e richiede troppi cicli. Più facile:

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

o utilizzando gli array:

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

Come Wombleton detto.;)

Tranne Rimuoverei spazi come parte della regex stessa, piuttosto che utilizzare una seconda regex per questo (per migliori prestazioni):

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

La regex verranno compilati su creazione dell'oggetto. Nelle operazioni ripetute non dovrebbe essere notevolmente più lento del looping di ogni stopword con un'operazione stringa/array, ed è molto più facile da capire.

Se v'è solo una breve, elenco statico di parole non significative, si potrebbe invece scrivere il proprio regex ottimizzato:

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

L'idea è che le parole che condividono lo stesso prefisso (ad esempio "di" e "on ") condividi lo stesso percorso di esecuzione fino al punto in cui si differenziano. Appena necessario nel tuo caso, ma bello sapere.

Problemi correlati