Dans mon code, je scinde une chaîne basée sur _
et récupère le deuxième élément du 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 le donner luck_buddy
?
J'ai trouvé cela var field = element.split(new char [] {'_'}, 2);
dans la réponse ac # stackoverflow mais cela ne fonctionne pas. Je l'ai essayé chez jsFiddle ...
la source
_
est mis en correspondance dans un groupe de capture et est ajouté à la liste de jetons pour cette raison."Aspect Ratio: 16:9".split(/:(.+)/)
out:["Aspect Ratio", " 16:9", ""]
": 16:9"
, il n'y a rien après le séparateur, créant ainsi la chaîne vide à la fin.Pour quoi avez-vous besoin d'expressions régulières et de tableaux?
la source
_
en écrivant:myString.substring( myString.indexOf('_', myString().indexOf('_') + 1) + 1 )
var str = "good_luck_buddy", res = str.split(/_(.+)/);
vous obtenez toutes les pièces:console.log(res[0]); console.log(res[1]);
[ string.substring(0, string.indexOf(options.divider)), string.substring(string.indexOf(options.divider) + 1) ]
Voilà. Également avec support d'aiguille variableJ'évite RegExp à tout prix. Voici une autre chose que vous pouvez faire:
la source
Remplacez la première instance par un espace réservé unique, puis scindez à partir de là.
Ceci est plus utile lorsque les deux côtés de la séparation sont nécessaires.
la source
Vous pouvez utiliser l'expression régulière comme:
Vous pouvez utiliser le deuxième paramètre qui spécifie la limite du fractionnement. c'est-à-dire: var field = element.split ('_', 1) [1];la source
'good_luck_buddy'.split('_', 1);
revient juste['good']
(:?.*)
censé être un groupe non capturant? Si c'est le cas, cela devrait l'être(?:.*)
, mais si vous le corrigez, vous constaterez que cela ne fonctionne plus.(:?.*)
correspond à un caractère facultatif:
suivi de zéro ou plusieurs caractères. Cette solution finit par fonctionner pour la même raison que le fait @ MarkF: tout après le premier_
est ajouté à la liste des jetons car il a été mis en correspondance dans un groupe de capture. (De plus, leg
modificateur n'a aucun effet lorsqu'il est utilisé dans une expression régulière fractionnée.)Cette solution a fonctionné pour moi
OU
la source
De nos jours,
String.prototype.split
cela permet en effet de limiter le nombre de scissions.caveat
Cela pourrait ne pas fonctionner comme vous vous y attendez. J'espérais qu'il ignorerait simplement le reste des délimiteurs, mais à la place, lorsqu'il atteint la limite, il fractionne à nouveau la chaîne restante, omettant la partie après la séparation des résultats de retour.
J'espérais:
la source
Javascript n'a
String.split
malheureusement aucun moyen de limiter le nombre réel de divisions. Il a un deuxième argument qui spécifie combien d'éléments fractionnés réels sont retournés, ce qui n'est pas utile dans votre cas. La solution serait de diviser la chaîne, de décaler le premier élément, puis de rejoindre les éléments restants:la source
J'ai besoin des deux parties de la ficelle, alors, regex lookbehind m'aide.
la source
Avec l'aide de la déstructuration, cela peut être plus lisible:
la source
La solution la plus rapide?
J'ai couru quelques benchmarks , et cette solution a énormément gagné: 1
Comparaison des performances avec d'autres solutions
Le seul concurrent proche était la même ligne de code, sauf en utilisant
substr
au lieu deslice
.D'autres solutions que j'ai essayé d'impliquer
split
ou ontRegExp
pris un gros coup de performance et étaient environ 2 ordres de grandeur plus lents. L'utilisationjoin
des résultatssplit
ajoute, bien sûr, une pénalité de performance supplémentaire.Pourquoi sont-ils plus lents? Chaque fois qu'un nouvel objet ou tableau doit être créé, JS doit demander un morceau de mémoire au système d'exploitation. Ce processus est très lent.
Voici quelques directives générales, au cas où vous poursuivriez des repères:
{}
ou les tableaux[]
(comme celui quisplit
crée) coûteront beaucoup en performances.RegExp
les recherches sont plus compliquées et donc plus lentes que les recherches de chaînes.Suppression au-delà de la première instance
Voici une solution qui découpera jusqu'à et incluant la nième instance. Ce n'est pas aussi rapide, mais sur la question de l'OP, il
gobble(element, '_', 1)
est toujours> 2x plus rapide qu'une solutionRegExp
orsplit
et peut faire plus:Avec la définition ci-dessus,
gobble('path/to/file.txt', '/')
donnerait le nom du fichier etgobble('prefix_category_item', '_', 1)
supprimerait le préfixe comme la première solution dans cette réponse.la source
La solution de Mark F est géniale mais elle n'est pas prise en charge par les anciens navigateurs. La solution de Kennebec est impressionnante et prise en charge par les anciens navigateurs, mais ne prend pas en charge l'expression régulière.
Donc, si vous cherchez une solution qui ne divise votre chaîne qu'une seule fois, qui est prise en charge par les anciens navigateurs et prend en charge l'expression régulière, voici ma solution:
la source
Pour les débutants comme moi qui ne sont pas habitués à l'expression régulière, cette solution de contournement a fonctionné:
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.
la source
Utilisez la
replace()
méthode chaîne avec une expression régulière :Cette expression régulière correspond à 0 ou plusieurs caractères avant le premier
_
, et le_
lui - même. La correspondance est alors remplacée par une chaîne vide.la source
document.body.innerHTML
partie ici est complètement inutile.document.body.innerHTML
?document.body
dépend du DOM pour être présent et ne fonctionnera pas sur un environnement JavaScript pur.console.log
est suffisant à cet effet ou simplement laisser le résultat dans une variable pour inspection.Cela a fonctionné pour moi sur Chrome + FF:
Si vous avez également besoin de la clé, essayez ceci:
la source
Voici un RegExp qui fait l'affaire.
Tout d'abord, il force le match à démarrer depuis le début avec le '^'. Ensuite, il correspond à n'importe quel nombre de caractères qui ne sont pas «_», c'est-à-dire tous les caractères avant le premier «_».
Le '?' signifie qu'un nombre minimal de caractères qui font correspondre le motif entier sont mis en correspondance par le '. *?' car il est suivi de «_», qui est ensuite inclus dans la correspondance comme son dernier caractère.
Par conséquent, ce split () utilise une partie correspondante comme son «séparateur» et le supprime des résultats. Ainsi, il supprime tout jusqu'au premier «_» inclus, et vous donne le reste comme 2e élément du résultat. Le premier élément est "" représentant la pièce avant la pièce correspondante. C'est "" car le match commence depuis le début.
Il existe d'autres RegExps qui fonctionnent aussi bien que /_(.*)/ donné par Chandu dans une réponse précédente.
Le /^.*?_/ a l'avantage que vous pouvez comprendre ce qu'il fait sans avoir à connaître le rôle spécial que les groupes de capture jouent avec replace ().
la source