scinde une chaîne uniquement sur la première instance de caractères spécifié

dans mon code j'ai divisé une chaîne basée sur _ et j'attrape le deuxième élément dans le tableau.

var element = $(this).attr('class');
var field = element.split('_')[1];

prend good_luck et me fournit luck . Fonctionne très bien!

Mais, maintenant, j'ai une classe qui ressemble à good_luck_buddy . Comment puis-je obtenir mon javascript pour ignorer le second _ et me donner luck_buddy ?

j'ai trouvé ce var field = element.split(new char [] {'_'}, 2); dans une réponse c# stackoverflow mais ça ne marche pas. J'ai essayé plus d'au jsFiddle...

185
demandé sur Ofeargall 2011-01-05 21:26:08

11 réponses

Utiliser parenthèse capturante :

"good_luck_buddy".split(/_(.+)/)[1]
"luck_buddy"

ils sont définis comme

si separator contient la saisie des parenthèses, les résultats appariés sont retourné dans le tableau.

donc dans ce cas nous voulons diviser à _.+ (c.-à-d. split separator étant une chaîne de sous-chaîne commençant par _ ) mais aussi que le résultat contiennent une partie de notre séparateur (i.e. tout après _ ).

dans cet exemple, notre séparateur (correspondant à _(.+) ) est _luck_buddy et le groupe capturé (dans le séparateur) est lucky_buddy . Sans la saisie des parenthèses, le luck_buddy (correspondant à .+ ) n'aurait pas été inclus dans le tableau des résultats, car c'est le cas avec le simple split que les séparateurs ne sont pas inclus dans le résultat.

272
répondu Mark F 2016-12-06 22:29:11

pour quoi avez-vous besoin d'expressions et de tableaux réguliers?

myString = myString.substring(myString.indexOf('_')+1)

var myString= "hello_there_how_are_you"
myString = myString.substring(myString.indexOf('_')+1)
console.log(myString)
182
répondu kennebec 2018-02-05 14:26:59

j'évite RegExp à tout prix. Voici une autre chose que vous pouvez faire:

"good_luck_buddy".split('_').slice(1).join('_')
20
répondu yonas 2013-07-12 22:31:15

remplacer la première instance par un paramètre unique, puis la séparer.

"good_luck_buddy".replace(/\_/,'&').split('&')

["good","luck_buddy"]

C'est plus utile lorsque les deux côtés de la fente sont nécessaires.

9
répondu sebjwallace 2016-03-28 13:30:48

Vous pouvez utiliser l'expression régulière comme:

var arr = element.split(/_(.*)/)
Vous pouvez utiliser le deuxième paramètre qui définit la limite de la rupture. j'.e: var field = élément.split('_', 1)[1]];
4
répondu Chandu 2011-01-05 20:07:39

Javascript String.split n'a malheureusement aucun moyen de limiter le nombre de divisions. Il a un deuxième argument qui spécifie combien d'articles sont retournés, ce qui n'est pas utile dans votre cas. La solution serait de diviser la chaîne, déplacer le premier élément off, puis rejoindre les autres éléments::

var element = $(this).attr('class');
var parts = element.split('_');

parts.shift(); // removes the first item from the array
var field = parts.join('_');
2
répondu Alex Vidal 2011-01-05 18:29:04

la solution de Mark F est géniale, mais elle n'est pas prise en charge par les vieux navigateurs. La solution de Kennebec est géniale et prise en charge par de vieux navigateurs, mais ne supporte pas regex.

Si, Si vous êtes à la recherche d'une solution qui divise votre chaîne une seule fois, qui est pris en charge par les vieux navigateurs et prend en charge regex, voici ma solution:

String.prototype.splitOnce = function(regex)
{
    var match = this.match(regex);
    if(match)
    {
        var match_i = this.indexOf(match[0]);
        
        return [this.substring(0, match_i),
        this.substring(match_i + match[0].length)];
    }
    else
    { return [this, ""]; }
}

var str = "something/////another thing///again";

alert(str.splitOnce(/\/+/)[1]);
0
répondu pmrotule 2015-01-28 18:10:38

pour les débutants comme moi qui ne sont pas habitués à L'Expression régulière, cette solution de contournement a fonctionné:

   var field = "Good_Luck_Buddy";
   var newString = field.slice( field.indexOf("_")+1 );
La méthode

slice() extrait une partie d'une chaîne et renvoie une nouvelle chaîne et la méthode indexOf () renvoie la position de la première occurrence trouvée d'une valeur spécifiée dans une chaîne.

0
répondu MZulkarnain Jaranee 2015-09-15 10:12:36

cela a fonctionné pour moi sur Chrome + FF:

"foo=bar=beer".split(/^[^=]+=/)[1] // "bar=beer"
"foo==".split(/^[^=]+=/)[1] // "="
"foo=".split(/^[^=]+=/)[1] // ""
"foo".split(/^[^=]+=/)[1] // undefined

si vous avez aussi besoin de la clé essayez ceci:

"foo=bar=beer".split(/^([^=]+)=/) // Array [ "", "foo", "bar=beer" ]
"foo==".split(/^([^=]+)=/) // [ "", "foo", "=" ]
"foo=".split(/^([^=]+)=/) // [ "", "foo", "" ]
"foo".split(/^([^=]+)=/) // [ "foo" ]

//[0] = ignored (holds the string when there's no =, empty otherwise)
//[1] = hold the key (if any)
//[2] = hold the value (if any)
0
répondu oriadam 2015-12-04 14:06:06

j'ai besoin des deux parties de la corde, donc, regex lookbehind m'aider avec cela.

const full_name = 'Maria do Bairro';
const [first_name, last_name] = full_name.split(/(?<=^[^ ]+) /);
console.log(first_name);
console.log(last_name);
0
répondu Édipo Costa Rebouças 2018-03-26 21:36:23

utiliser la chaîne replace() méthode avec un regex :

document.body.innerHTML = "good_luck_buddy".replace(/.*?_/, "");

ce regex correspond à 0 caractères ou plus avant le premier _ , et le _ lui-même. La correspondance est alors remplacée par une chaîne vide.

0
répondu James T 2018-05-08 11:55:09