Como dividir a string "Thequickbrownfoxjumps"
em substrings de tamanho igual em Java. Por exemplo. "Thequickbrownfoxjumps"
de 4 tamanho igual deve dar a saída.
["Theq","uick","brow","nfox","jump","s"]
Pergunta semelhante:
Como dividir a string "Thequickbrownfoxjumps"
em substrings de tamanho igual em Java. Por exemplo. "Thequickbrownfoxjumps"
de 4 tamanho igual deve dar a saída.
["Theq","uick","brow","nfox","jump","s"]
Pergunta semelhante:
Respostas:
Aqui está a versão de uma linha do regex:
\G
é uma asserção de largura zero que corresponde à posição em que a correspondência anterior terminou. Se não foi páreo anterior, que corresponde ao início da entrada, o mesmo que\A
. O lookbehind em anexo corresponde à posição de quatro caracteres desde o final da última partida.Ambos olham para trás e
\G
são recursos avançados de regex, não suportados por todos os tipos. Além disso,\G
não é implementado de forma consistente nos sabores que o suportam. Esse truque funcionará (por exemplo) em Java , Perl, .NET e JGSoft, mas não em PHP (PCRE), Ruby 1.9+ ou TextMate (ambos Oniguruma). O JavaScript/y
(sinalizador fixo) não é tão flexível quanto\G
, e não poderia ser usado dessa maneira, mesmo se o JS suportasse o lookback.Devo mencionar que não recomendo necessariamente esta solução se você tiver outras opções. As soluções não regex nas outras respostas podem ser mais longas, mas também são auto-documentadas; este é exatamente o oposto disso. ;)
Além disso, isso não funciona no Android, que não suporta o uso de
\G
lookbehinds.fonte
String.substring()
em vez de um regex, mas exige algumas linhas extras de código, será executado em algum lugar na ordem de 5x mais rápido ...(?s)
na expressão regular:(?s)(?<=\\G.{4})
.java.util.regex.PatternSyntaxException: Look-behind pattern matches must have a bounded maximum length
Bem, é bastante fácil fazer isso com operações aritméticas e de cordas simples:
Não acho que valha a pena usar um regex para isso.
EDIT: Meu raciocínio para não usar uma regex:
fonte
Splitter.fixedLength(4)
conforme sugerido pelo seanizer.Isso é muito fácil com o Google Guava :
Resultado:
Ou, se você precisar do resultado como uma matriz, poderá usar este código:
Referência:
Splitter.fixedLength()
Splitter.split()
Iterables.toArray()
Nota: A construção do divisor é mostrada em linha acima, mas como os divisores são imutáveis e reutilizáveis, é uma boa prática armazená-los em constantes:
fonte
String.join(separator, arrayOrCollection)
Se você estiver usando as bibliotecas de uso geral de goiaba do Google (e, sinceramente, qualquer novo projeto Java provavelmente deveria ser), isso é incrivelmente trivial para a classe Splitter :
e é isso . Fácil como!
fonte
fonte
src.length()
elen
são ambosint
s, sua ligaçãoceiling
não está cumprindo o que você deseja - confira como algumas das outras respostas estão fazendo: (src.length () + len - 1) / lenfonte
for
loops?for
loop é realmente uma opção mais 'natural' para isso :-) Obrigado por apontar isso.Você pode usar
substring
fromString.class
(manipulação de exceções) ou Apache lang commons (ele lida com exceções para você)Coloque-o dentro de um loop e você estará pronto.
fonte
substring
método naString
classe padrão ?Prefiro esta solução simples:
fonte
substring
implementação mudou com o Java 7, atualização 6, em meados de 2012, quando os camposoffset
ecount
foram removidos daString
classe. Portanto, a complexidadesubstring
tornou-se linear muito antes de essa resposta ser feita. Mas para uma sequência pequena como o exemplo, ela ainda é executada com rapidez suficiente e para sequências mais longas ... bem, essa tarefa raramente ocorre na prática.Aqui está uma implementação de um liner usando fluxos Java8:
Ele fornece a seguinte saída:
fonte
String[] result = IntStream.range(0, (input.length()+3)/4) .mapToObj(i -> input.substring(i *= 4, Math.min(i + 4, input.length()))) .toArray(String[]::new);
Aqui está uma versão de uma linha que usa o Java 8 IntStream para determinar os índices do início da fatia:
fonte
Caso você queira dividir a string igualmente para trás, ou seja, da direita para a esquerda, por exemplo, para dividir
1010001111
em[10, 1000, 1111]
, aqui está o código:fonte
eu uso a seguinte solução java 8:
fonte
Solução Java 8 (como essa, mas um pouco mais simples):
fonte
Perguntei a Alan Moore em um comentário para a solução aceita como lidar com seqüências de caracteres com novas linhas. Ele sugeriu o uso de DOTALL.
Usando sua sugestão, criei uma pequena amostra de como isso funciona:
Mas também gosto da solução @Jon Skeets em https://stackoverflow.com/a/3760193/1237974 . Para manutenção em projetos maiores, onde nem todos são igualmente experientes em expressões regulares, eu provavelmente usaria a solução Jons.
fonte
Outra solução de força bruta poderia ser,
Onde o código apenas percorre a string com substrings
fonte
Resultado
fonte
fonte
Aqui está minha versão baseada nos fluxos RegEx e Java 8. Vale ressaltar que o
Matcher.results()
método está disponível desde o Java 9.Teste incluído.
fonte
fonte
fonte