Vous pouvez faire quelque chose comme ça:
"1234567890".match(/.{1,2}/g);
// Results in:
["12", "34", "56", "78", "90"]
La méthode fonctionnera toujours avec des chaînes dont la taille n'est pas un multiple exact de la taille de bloc:
"123456789".match(/.{1,2}/g);
// Results in:
["12", "34", "56", "78", "9"]
En général, pour toute chaîne dont vous voulez extraire au plus n sous-chaînes, vous feriez:
str.match(/.{1,n}/g); // Replace n with the size of the substring
Si votre chaîne peut contenir des retours à la ligne ou des retours chariot, vous feriez:
str.match(/(.|[\r\n]){1,n}/g); // Replace n with the size of the substring
En ce qui concerne les performances, j'ai essayé cela avec environ 10 000 caractères et cela a pris un peu plus d'une seconde sur Chrome. YMMV.
Cela peut également être utilisé dans une fonction réutilisable:
function chunkString(str, length) {
return str.match(new RegExp('.{1,' + length + '}', 'g'));
}
.
ne correspond pas du tout à la nouvelle ligne. Je vais mettre à jour la réponse pour qu'il prenne\n
et\r
en compte.var chunks = str.split("").reverse().join().match(/.{1, 4}/).map(function(s) { return s.split("").reverse().join(); });
. Cela se fait en morceaux de 4. Je ne sais pas trop ce que vous entendez par «moins ou plus». Gardez à l'esprit que cela ne fonctionnera pas en général, en particulier avec les chaînes qui contiennent des caractères de combinaison et peuvent également casser les chaînes Unicode.[^]
. Avec cela, votre exemple se traduirait parstr.match(/[^]{1,n}/g)
match
,slice
,substr
etsubstring
match
etslice
pour différentes tailles de morceauxmatch
etslice
avec de petits morceauxConclusion:
match
est très inefficace,slice
c'est mieux, sur Firefoxsubstr
/substring
c'est encore mieuxmatch
est encore plus inefficace pour les chaînes courtes (même avec l'expression régulière mise en cache - probablement en raison du temps d'installation de l'analyse syntaxique de l'expression régulière)match
est encore plus inefficace pour les gros morceaux (probablement en raison de l'impossibilité de "sauter")match
surpasseslice
sur les anciens IE mais perd toujours sur tous les autres systèmesla source
J'ai créé plusieurs variantes plus rapides que vous pouvez voir sur jsPerf . Mon préféré est le suivant:
la source
Math.ceil()
pour déterminer le nombre correct de morceaux.Il s'agit d'une solution rapide et simple -
la source
substr()
place desubstring()
.Surprise! Vous pouvez utiliser le fractionnement pour diviser.
Résulte en
[ '12', '34', '56', '78', '90', ' ' ]
la source
filter (o=>o)
?filter(x=>x)
est utilisé pour filtrer ces éléments videsla source
J'ai écrit une fonction étendue, donc la longueur du bloc peut également être un tableau de nombres, comme [1,3]
Le code
retournera:
la source
il divise la grande chaîne en petites chaînes de mots donnés .
la source
la source
J'utiliserais une expression régulière ...
la source
Appelez-le au besoin
la source
Voici une solution que j'ai trouvée pour les chaînes de modèle après un peu d'expérimentation:
Usage:
la source
Vous pouvez utiliser
reduce()
sans aucune expression régulière:la source
reduce
méthode.Sous la forme d'une fonction prototype:
la source
Voici le code que j'utilise, il utilise String.prototype.slice .
Oui, la réponse est assez longue car elle essaie de suivre les normes actuelles aussi près que possible et contient bien sûr un nombre raisonnable de commentaires JSDOC . Cependant, une fois minifié, le code n'est que de 828 octets et une fois compressé pour la transmission, il n'est que de 497 octets.
La 1 méthode à laquelle cela s'ajoute
String.prototype
(en utilisant Object.defineProperty si disponible) est:Un certain nombre de tests ont été inclus pour vérifier la fonctionnalité.
Vous craignez que la longueur du code n'affecte les performances? Pas besoin de vous inquiéter, http://jsperf.com/chunk-string/3
Une grande partie du code supplémentaire est là pour être sûr que le code répondra de la même manière dans plusieurs environnements javascript.
la source
En utilisant la méthode slice ():
La même chose peut être faite en utilisant la méthode substring ().
la source
Mon problème avec la solution ci-dessus est qu'elle porte la chaîne en morceaux de taille formelle quelle que soit la position dans les phrases.
Je pense que ce qui suit une meilleure approche; bien qu'il ait besoin d'un ajustement des performances:
la source
Vous pouvez certainement faire quelque chose comme
pour obtenir ceci:
Si vous souhaitez saisir / ajuster dynamiquement la taille de bloc de sorte que les blocs soient de taille n, vous pouvez le faire:
Pour trouver tous les morceaux de taille n possibles dans la chaîne d'origine, essayez ceci:
Vous devriez vous retrouver avec:
la source
la source
Qu'en est-il de ce petit morceau de code:
la source
la source