web-dev-qa-db-fra.com

Chaîne fractionnée JavaScript avec .match (regex)

Depuis le réseau de développeurs Mozilla pour la fonction split():

La méthode split () renvoie le nouveau tableau.

Une fois trouvé, le séparateur est supprimé de la chaîne et des sous-chaînes sont retournés dans un tableau. Si separator n'est pas trouvé ou est omis, le fichier tableau contient un élément composé de la chaîne entière. Si separator est une chaîne vide, str est converti en un tableau de personnages.

Si separator est une expression régulière contenant la capture entre parenthèses, chaque fois que le séparateur est apparié, les résultats (y compris tous les résultats non définis) des parenthèses de capture sont épissé dans le tableau de sortie. Cependant, tous les navigateurs ne supportent pas cela aptitude.

Prenons l'exemple suivant:

var string1 = 'one, two, three, four';
var splitString1 = string1.split(', ');
console.log(splitString1); // Outputs ["one", "two", "three", "four"]

C'est une approche vraiment propre. J'ai essayé la même chose avec une expression régulière et une chaîne quelque peu différente:

var string2 = 'one split two split three split four';
var splitString2 = string2.split(/\ split\ /);
console.log(splitString2); // Outputs ["one", "two", "three", "four"]

Cela fonctionne aussi bien que le premier exemple. Dans l'exemple suivant, j'ai encore une fois modifié la chaîne, avec trois délimiteurs différents:

var string3 = 'one split two splat three splot four';
var splitString3 = string3.split(/\ split\ |\ splat\ |\ splot\ /);
console.log(splitString3); // Outputs ["one", "two", "three", "four"]

Cependant, l'expression régulière devient relativement désordonnée en ce moment. Je peux regrouper les différents délimiteurs, mais le résultat inclura alors ces délimiteurs:

var string4 = 'one split two splat three splot four';
var splitString4 = string4.split(/\ (split|splat|splot)\ /);
console.log(splitString4); // Outputs ["one", "split", "two", "splat", "three", "splot", "four"]

J'ai donc essayé de supprimer les espaces de l'expression régulière tout en quittant le groupe, sans grand succès:

var string5 = 'one split two splat three splot four';
var splitString5 = string5.split(/(split|splat|splot)/);
console.log(splitString5);

Bien que, lorsque je supprime les parenthèses dans l'expression régulière, le délimiteur disparaît de la chaîne scindée:

var string6 = 'one split two splat three splot four';
var splitString6 = string6.split(/split|splat|splot/);
console.log(splitString6); // Outputs ["one ", " two ", " three ", " four"]

Une autre solution consisterait à utiliser match() pour filtrer les délimiteurs, sauf que je ne comprends pas vraiment comment fonctionne la suppression inversée:

var string7 = 'one split two split three split four';
var splitString7 = string7.match(/((?!split).)*/g);
console.log(splitString7); // Outputs ["one ", "", "plit two ", "", "plit three ", "", "plit four", ""]

Pour commencer, cela ne correspond pas à la Parole entière. Et pour être honnête, je ne sais même pas ce qui se passe exactement ici.


Comment scinder correctement une chaîne en utilisant des expressions régulières sans avoir le délimiteur dans mon résultat?

6
Audite Marlow

Utilisez un groupe non capturant comme regex fractionné. En utilisant un groupe non capturant, les correspondances fractionnées ne seront pas incluses dans le tableau résultant.

var string4 = 'one split two splat three splot four';
var splitString4 = string4.split(/\s+(?:split|splat|splot)\s+/);
console.log(splitString4);

// Output => ["one", "two", "three", "four"]
12
anubhava

Si vous voulez utiliser match, vous pouvez l'écrire comme ceci:

'one split two split three split four'.match(/(\b(?!split\b)[^ $]+\b)/g)
["one", "two", "three", "four"]

Ce qu'il fait?

  • \b correspond à une limite de mot

  • (?!split\b) Négatif regarder devant, vérifier si le mot est passplit

  • [^ $]+ Correspond à autre chose que l'espace ou $, fin de chaîne. Ce modèle correspond à un mot, le regard devant vous assure que ce à quoi il correspond n'est pas split.

  • \b correspond à la fin du mot.

1
nu11p01n73R