string1.split("(?=-)");
Cela fonctionne parce qu' split
prend réellement une expression régulière. Ce que vous êtes en train de voir est un "zéro-largeur d'anticipation positif".
J'aimerais expliquer plus mais ma fille veut jouer la partie de thé. :)
Edit: De Retour!
Pour expliquer cela, je vais d'abord vous montrer un autre split
fonctionnement:
"Ram-sita-laxman".split("");
Ce partage votre chaîne sur chaque chaîne de longueur nulle. Il y a une chaîne de longueur zéro entre chaque personnage. Par conséquent, le résultat est:
["", "R", "a", "m", "-", "s", "i", "t", "a", "-", "l", "a", "x", "m", "a", "n"]
Maintenant, j'ai modifier mon expression régulière (""
) seulement des chaînes de longueur nulle si ils sont suivis par un tiret.
"Ram-sita-laxman".split("(?=-)");
["Ram", "-sita", "-laxman"]
Dans cet exemple, l' ?=
moyen "d'anticipation". Plus précisément, cela signifie "positif d'anticipation". Pourquoi le "positif"? Car vous pouvez aussi avoir des négatifs d'anticipation (?!
) qui sera divisée sur chaque chaîne de longueur nulle est pas suivi d'un tiret:
"Ram-sita-laxman".split("(?!-)");
["", "R", "a", "m-", "s", "i", "t", "a-", "l", "a", "x", "m", "a", "n"]
Vous pouvez également vous positif lookbehind (?<=
) qui sera divisée sur chaque chaîne de longueur nulle est précédée par un tiret:
"Ram-sita-laxman".split("(?<=-)");
["Ram-", "sita-", "laxman"]
Enfin, vous pouvez également avoir des négatifs lookbehind (?<!
) qui sera divisée sur chaque chaîne de longueur nulle est pas précédé d'un tiret:
"Ram-sita-laxman".split("(?<!-)");
["", "R", "a", "m", "-s", "i", "t", "a", "-l", "a", "x", "m", "a", "n"]
Ces quatre expressions sont collectivement connus comme la lookaround expressions.
Bonus: les Mettre ensemble
Je voulais juste montrer un exemple que j'ai rencontré récemment qui combine deux de la lookaround expressions. Supposons que vous souhaitez diviser un CapitalCase identificateur de ses jetons:
"MyAwesomeClass" => ["My", "Awesome", "Class"]
Vous pouvez accomplir cela en utilisant cette expression régulière:
"MyAwesomeClass".split("(?<=[a-z])(?=[A-Z])");
Cette fentes sur chaque chaîne de longueur nulle est précédée par une lettre minuscule ((?<=[a-z])
) suivie par une lettre majuscule ((?=[A-Z])
).
Cette technique fonctionne aussi avec les camelCase identifiants.