Comment diviser la chaîne "Thequickbrownfoxjumps"
en sous-chaînes de taille égale en Java. Par exemple. "Thequickbrownfoxjumps"
de 4 taille égale devrait donner la sortie.
["Theq","uick","brow","nfox","jump","s"]
Question similaire:
Diviser la chaîne en sous-chaînes de longueur égale dans Scala
Réponses:
Voici la version regex one-liner:
\G
est une assertion de largeur nulle qui correspond à la position où la correspondance précédente s'est terminée. S'il n'y avait pas de correspondance précédente, il correspond au début de l'entrée, le même que\A
. Le lookbehind englobant correspond à la position de quatre caractères à partir de la fin de la dernière correspondance.Les deux
\G
sont des fonctionnalités regex avancées, non prises en charge par toutes les versions. En outre,\G
n'est pas implémenté de manière cohérente dans les versions qui le prennent en charge. Cette astuce fonctionnera (par exemple) en Java , Perl, .NET et JGSoft, mais pas en PHP (PCRE), Ruby 1.9+ ou TextMate (les deux Oniguruma). JavaScript/y
(indicateur collant) n'est pas aussi flexible que\G
, et ne pourrait pas être utilisé de cette façon même si JS prenait en charge lookbehind.Je dois mentionner que je ne recommande pas nécessairement cette solution si vous avez d'autres options. Les solutions non-regex dans les autres réponses peuvent être plus longues, mais elles sont également auto-documentées; celui-ci est à peu près le contraire de cela. ;)
De plus, cela ne fonctionne pas sous Android, qui ne prend pas en charge l'utilisation de
\G
lookbehinds.la source
String.substring()
place d'une expression régulière, tout en nécessitant quelques lignes de code supplémentaires, fonctionnera quelque part de l'ordre de 5 fois plus vite ...(?s)
dans le regex:(?s)(?<=\\G.{4})
.java.util.regex.PatternSyntaxException: Look-behind pattern matches must have a bounded maximum length
Eh bien, c'est assez facile de le faire avec de simples opérations arithmétiques et de chaîne:
Je ne pense pas que cela vaille vraiment la peine d'utiliser une regex pour cela.
EDIT: Mon raisonnement pour ne pas utiliser une regex:
la source
Splitter.fixedLength(4)
comme suggéré par seanizer.C'est très simple avec Google Guava :
Production:
Ou si vous avez besoin du résultat sous forme de tableau, vous pouvez utiliser ce code:
Référence:
Splitter.fixedLength()
Splitter.split()
Iterables.toArray()
Remarque: la construction du séparateur est montrée en ligne ci-dessus, mais comme les séparateurs sont immuables et réutilisables, il est recommandé de les stocker dans des constantes:
la source
String.join(separator, arrayOrCollection)
Si vous utilisez les bibliothèques à usage général de goyave de Google (et très honnêtement, tout nouveau projet Java devrait probablement l' être), c'est incroyablement trivial avec la classe Splitter :
et c'est tout . C'est aussi simple que ça!
la source
la source
src.length()
etlen
sont tous les deuxint
, votre appelceiling
n'accomplit pas ce que vous voulez - voyez comment certaines des autres réponses le font: (src.length () + len - 1) / lenla source
for
boucles?for
boucle est en effet une utilisation de choix plus «naturelle» pour cela :-) Merci de l'avoir signalé.Vous pouvez utiliser
substring
fromString.class
(gestion des exceptions) ou depuis Apache lang commons (il gère les exceptions pour vous)Mettez-le dans une boucle et vous êtes prêt à partir.
la source
substring
méthode de laString
classe standard ?Je préfère cette solution simple:
la source
substring
implémentation a changé avec Java 7, mise à jour 6 au milieu de 2012, lorsque les champsoffset
etcount
ont été supprimés de laString
classe. La complexité desubstring
s'est donc transformée en linéaire bien avant que cette réponse ne soit faite. Mais pour une petite chaîne comme l'exemple, elle tourne toujours assez vite et pour des chaînes plus longues… eh bien cette tâche se produit rarement en pratique.Voici une implémentation en une seule ligne utilisant des flux Java8:
Il donne la sortie suivante:
la source
String[] result = IntStream.range(0, (input.length()+3)/4) .mapToObj(i -> input.substring(i *= 4, Math.min(i + 4, input.length()))) .toArray(String[]::new);
Voici une version à une ligne qui utilise Java 8 IntStream pour déterminer les index des débuts de tranche:
la source
Si vous voulez diviser la chaîne également en arrière, soit de droite à gauche, par exemple, de diviser
1010001111
pour[10, 1000, 1111]
, voici le code:la source
j'utilise la solution java 8 suivante:
la source
Solution Java 8 (comme celle-ci mais un peu plus simple):
la source
J'ai demandé à @Alan Moore dans un commentaire sur la solution acceptée comment les chaînes avec des sauts de ligne pouvaient être gérées. Il a suggéré d'utiliser DOTALL.
En utilisant sa suggestion, j'ai créé un petit échantillon de la façon dont cela fonctionne:
Mais j'aime aussi la solution @Jon Skeets sur https://stackoverflow.com/a/3760193/1237974 . Pour la maintenabilité dans des projets plus importants où tout le monde n'a pas la même expérience des expressions régulières, j'utiliserais probablement la solution Jons.
la source
Une autre solution de force brute pourrait être,
Où le code parcourt simplement la chaîne avec des sous-chaînes
la source
Résultat
la source
la source
Voici ma version basée sur les flux RegEx et Java 8. Il convient de mentionner que cette
Matcher.results()
méthode est disponible depuis Java 9.Test inclus.
la source
la source
la source