web-dev-qa-db-fra.com

Couper une chaîne à la nième occurrence d'un caractère

Ce que je veux faire, c'est prendre une chaîne telle que this.those.that et obtenir une sous-chaîne vers ou à partir de la nième occurrence d'un caractère. Ainsi, depuis le début de la chaîne jusqu'à la 2e occurrence de . retournerais this.those. De même, à partir de la 2ème occurrence de . à la fin de la chaîne retournerait that. Désolé si ma question est brumeuse, ce n'est pas si facile à expliquer. De plus, veuillez ne pas suggérer de faire des variables supplémentaires, et le résultat sera dans une chaîne et non dans un tableau.

44
Anonymous

Vous pourriez le faire sans tableaux, mais cela prendrait plus de code et serait moins lisible.

En règle générale, vous ne souhaitez utiliser autant de code que pour effectuer le travail, ce qui augmente également la lisibilité. Si vous trouvez que cette tâche devient un problème de performances (comparez-la), , alors vous pouvez décider de commencer à refactoriser les performances.

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

// To get the substring BEFORE the nth occurence
var tokens2 = str.split(delimiter).slice(0, start),
    result2 = tokens2.join(delimiter); // this

console.log(result2)

jsFiddle .

78
alex

Essaye ça :

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

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

4
user2165842

Je suis perplexe quant à la raison pour laquelle vous voulez faire des choses uniquement avec des fonctions de chaîne, mais je suppose que vous pourriez faire quelque chose comme ceci:

//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 recommanderais fortement quelque chose comme le code beaucoup plus simple d'Alex.

3
NT3RP

Juste au cas où quelqu'un aurait besoin à la fois de "ceci" et de "ceux-ci" d'une manière comme alex décrit dans son commentaire , 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;
3
hooke

Si vous voulez vraiment vous en tenir aux méthodes de chaîne, alors:

// 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
RobG