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...
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.
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)
j'évite RegExp à tout prix. Voici une autre chose que vous pouvez faire:
"good_luck_buddy".split('_').slice(1).join('_')
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.
Vous pouvez utiliser l'expression régulière comme:
var arr = element.split(/_(.*)/)
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('_');
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]);
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.
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)
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);