Tagliare una corda all’ennesima occorrenza di un personaggio

Quello che voglio fare è prendere una stringa come this.those.that e ottenere una sottostringa da o all’ennesima occorrenza di un personaggio. Quindi, dall’inizio della stringa alla seconda occorrenza di . restituire this.those . Allo stesso modo, dalla seconda occorrenza di . alla fine della stringa lo restituirebbe. Scusa se la mia domanda è nebbiosa, non è così facile da spiegare. Inoltre, per favore non suggerire di creare variabili extra, e il risultato sarà in una stringa e non in una matrice.

Potresti farlo senza matrici, ma ci vorrebbe più codice ed essere meno leggibile.

In genere, si desidera utilizzare tutto il codice per eseguire il lavoro e ciò aumenta anche la leggibilità. Se ritieni che questa attività stia diventando un problema di prestazioni (esegui il benchmark), puoi decidere di avviare il refactoring per le prestazioni.

 var str = 'this.those.that', delimiter = '.', start = 1, tokens = str.split(delimiter).slice(start), result = tokens.join(delimiter); // those.that 

jsFiddle .

Prova questo :

 "qwe.fs.xczv.xcv.xcv.x".replace(/([^\.]*\.){3}/, ''); "xcv.xcv.x" 

"qwe.fs.xczv.xcv.xcv.x".replace(/([^\.]*\.){**nth**}/, ''); – dove è n è la quantità di eventi da rimuovere.

Sono perplesso sul motivo per cui vuoi fare le cose puramente con le funzioni di stringa, ma suppongo che potresti fare qualcosa di simile al seguente:

 //str - the string //c - the character or string to search for //n - which occurrence //fromStart - if true, go from beginning to the occurrence; else go from the occurrence to the end of the string var cut = function (str, c, n, fromStart) { var strCopy = str.slice(); //make a copy of the string var index; while (n > 1) { index = strCopy.indexOf(c) strCopy = strCopy.substring(0, index) n--; } if (fromStart) { return str.substring(0, index); } else { return str.substring(index+1, str.length); } } 

Tuttavia, vorrei fortemente sostenere qualcosa come il codice molto più semplice di alex.

Nel caso in cui qualcuno abbia bisogno sia di “questo” sia di “quelli” in un modo come descritto da alex nel suo commento , ecco un codice modificato:

 var str = 'this.those.that', delimiter = '.', start = 1, tokens = str.split(delimiter), result = [tokens.slice(0, start), tokens.slice(start)].map(function(item) { return item.join(delimiter); }); // [ 'this', 'those.that' ] document.body.innerHTML = result; 

Se vuoi davvero attenersi ai metodi stringa, allora:

 // Return a substring of s upto but not including // the nth occurence of c function getNth(s, c, n) { var idx; var i = 0; var newS = ''; do { idx = s.indexOf(c); newS += s.substring(0, idx); s = s.substring(idx+1); } while (++i < n && (newS += c)) return newS; }