web-dev-qa-db-fra.com

Fractionner la chaîne une fois en javascript?

Comment puis-je diviser une chaîne une seule fois, c’est-à-dire faire 1|Ceci n'est pas une pipe: | Oui analyser en: ["1", "Ceci n'est pas une pipe: | Oui"]?

La limite de division ne semble pas aider ...

65

Ce n'est pas une belle approche, mais fonctionne avec une efficacité décente:

var string = "1|Ceci n'est pas une pipe: | Oui";
var components = string.split('|');
alert([components.shift(), components.join('|')]​);​​​​​

En voici une rapide démonstration

70
Nick Craver

Vous voudriez utiliser String.indexOf('|') pour obtenir l'index de la première occurrence de '|'.

var i = s.indexOf('|');
var splits = [s.slice(0,i), s.slice(i+1)];
98
yarmiganosca

Vous pouvez utiliser:

var splits = str.match(/([^|]*)\|(.*)/);
splits.shift();

La regex divise la chaîne en deux groupes correspondants (entre parenthèses), le texte précédant le premier | et le texte après. Ensuite, nous shift le résultat pour supprimer la correspondance de chaîne complète (splits[0]).

12
Matthew Flaschen

une doublure et imo, plus simple:

var str = 'I | am super | cool | yea!';
str.split('|').slice(1).join('|');

Cela retourne "je suis super | cool | oui!"

6
Hassek

Essaye ça:

function splitOnce(input, splitBy) {
    var fullSplit = input.split(splitBy);
    var retVal = [];
    retVal.Push( fullSplit.shift() );
    retVal.Push( fullSplit.join( splitBy ) );
    return retVal;
}

var whatever = splitOnce("1|Ceci n'est pas une pipe: | Oui", '|');
3
Josh the Goods

Si la chaîne ne contient pas le délimiteur @ La solution de NickCraver renverra toujours un tableau de deux éléments, le second étant une chaîne vide. Je préfère que le comportement corresponde à celui de la scission. C'est-à-dire que si la chaîne d'entrée ne contient pas le délimiteur, vous ne renvoyez qu'un tableau avec un seul élément.

var splitOnce = function(str, delim) {
    var components = str.split(delim);
    var result = [components.shift()];
    if(components.length) {
        result.Push(components.join(delim));
    }
    return result;
};

splitOnce("a b c d", " "); // ["a", "b c d"]
splitOnce("a", " "); // ["a"]
3
Raine Revere

Aussi mauvais que la plupart des réponses à ce jour:

var splits = str.split('|');
splits.splice(1, splits.length - 1, splits.slice(1).join('|'));
1
wombleton

Une solution alternative, courte, en plus des produits utilisés ailleurs, consiste à utiliser la limite de replace() à votre avantage.

var str = "1|Ceci n'est pas une pipe: | Oui";
str.replace("|", "aUniquePhraseToSaySplitMe").split("aUniquePhraseToSaySplitMe");

Comme @servoir le souligne dans les commentaires, la phrase unique doit être véritablement unique. Elle ne peut pas être dans la source sur laquelle vous exécutez cette scission, sinon vous ferez scinder la chaîne en plus d'éléments que vous le souhaitez. Comme il le dit si bien, un caractère non imprimable peut le faire si vous l'exécutez contre l'entrée de l'utilisateur (c'est-à-dire que vous l'avez tapé dans un navigateur).

0
D_N

La syntaxe ES6 permet une approche différente:

function splitOnce(s, on) {
   [first, ...rest] = s.split(on)
   return [first, rest.length > 0? rest.join(on) : null]
}

Ce qui gère également l'éventualité d'une chaîne n'ayant pas un | en renvoyant null plutôt qu'une chaîne vide, ce qui est plus explicite.

splitOnce("1|Ceci n'est pas une pipe: | Oui", "|")
>>> ["1", "Ceci n'est pas une pipe: | Oui"]

splitOnce("Celui-ci n'a pas de pipe symbol!", "|")
>>> ["Celui-ci n'a pas de pipe symbol!", null]

Pas de pipe? C'est null!

J'ai ajouté cette réponse principalement pour pouvoir faire un jeu de mots sur le symbole du tuyau, mais aussi pour montrer la syntaxe es6 - c'est incroyable le nombre de personnes qui ne l'utilisent toujours pas ...

0
andyhasit

Celui-ci est un peu plus long, mais il fonctionne comme je crois que la limite devrait:

function split_limit(inString, separator, limit){
    var ary = inString.split(separator);
    var aryOut = ary.slice(0, limit - 1);
    if(ary[limit - 1]){
        aryOut.Push(ary.slice(limit - 1).join(separator));
    }
    return aryOut;
}
console.log(split_limit("1|Ceci n'est pas une pipe: | Oui","|", 1));
console.log(split_limit("1|Ceci n'est pas une pipe: | Oui","|", 2));
console.log(split_limit("1|Ceci n'est pas une pipe: | Oui","|", 3));
console.log(split_limit("1|Ceci n'est pas une pipe: | Oui","|", 7));

https://jsfiddle.net/2gyxuo2j/

limit of Zero renvoie des résultats amusants, mais au nom de l'efficacité, j'ai oublié le chèque. Vous pouvez ajouter ceci comme première ligne de la fonction si vous en avez besoin:

if(limit < 1) return [];
0
alfadog67