Couper une corde à la nième occurrence d'un caractère

ce que je veux faire c'est prendre une chaîne comme this.those.that et obtenir une sous-chaîne ou de la n-ième occurrence d'un caractère. Ainsi, depuis le début de la chaîne à la 2ème occurrence de . retour this.those. De même, à partir de la 2ème occurrence de . à la fin de la chaîne de retour that. Désolé si ma question Est brumeuse, ce n'est pas si facile à expliquer. Aussi, s'il vous plaît ne suggérez pas de faire des variables supplémentaires, et le résultat sera dans une chaîne et non un tableau.

42
demandé sur Anonymous 2011-03-31 06:22:23

5 réponses

Vous pouvez le faire sans tableaux, mais il faudrait plus de code et serait moins lisible.

généralement, vous voulez seulement utiliser autant de code pour obtenir le travail fait, et cela augmente également la lisibilité. Si vous trouvez que cette tâche devient une question de performance (benchmark it), vous pouvez décider de commencer le remaniement pour la performance.

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

jsFiddle.

71
répondu alex 2016-04-28 09:14:48

essaye ceci :

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

"qwe.fs.xczv.xcv.xcv.x".replace(/([^\.]*\.){**nth**}/, ''); - où est nth est la quantité d'occurrence à supprimer.

4
répondu user2165842 2013-10-18 11:41:22

je suis perplexe quant à savoir pourquoi vous voulez faire des choses purement avec des fonctions de chaîne, mais je suppose que vous pourriez faire quelque chose comme ce qui suit:

//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);
    }
}

cependant, je prône fortement quelque chose comme le code beaucoup plus simple d'alex.

3
répondu NT3RP 2011-03-31 02:43:02

Juste au cas où quelqu'un a besoin à la fois de "ce" et "ceux qui.cela" d'une manière comme alex décrit dans soncommentaire, voici un code modifié:

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;
2
répondu hooke 2017-05-23 12:18:01

Si vous voulez vraiment en tenir à la chaîne de méthodes, puis:

// 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;
}
1
répondu RobG 2011-03-31 02:50:21