Use String.split () com vários delimitadores

201

Eu preciso dividir uma base de string no delimitador -e .. Abaixo estão os resultados desejados.

AA.BB-CC-DD.zip ->

AA
BB
CC
DD
zip 

mas meu código a seguir não funciona.

private void getId(String pdfName){
    String[]tokens = pdfName.split("-\\.");
}
Thang Pham
fonte
Com base no que você disse, parece que está funcionando bem. Qual é a sua saída desejada?
Jeff
2
@ Jeff: Ele mostrou a sua saída desejada ( AA/ BB/ CC...)
TJ Crowder
2
Você tem certeza? Eu interpretei isso como sua saída atual, não sua saída desejada. Talvez seja hora de se levantar e andar um pouco.
Jeff
@ Jeff: Desculpe pela confusão, eu atualizei meu post para esclarecer seu mal-entendido.
Thang Pham
Regex irá degradar seu desempenho. Eu recomendaria escrever um método que irá caractere por caractere e, se necessário, dividirá a string. Você pode otimizar isso ainda mais para obter desempenho de log (n).
Princesh

Respostas:

311

Eu acho que você precisa incluir o operador regex OR :

String[]tokens = pdfName.split("-|\\.");

O que você possui corresponderá:
[DASH seguido por DOT juntos] -.
não
[DASH ou DOT nenhum deles] -ou.

Richard H
fonte
9
por que exigimos duas barras invertidas ??
pjain
7
O .caractere na expressão regular significa qualquer caractere que não seja a nova linha. tutorialspoint.com/java/java_regular_expressions.htm Nesse caso, porém, eles queriam o caractere real .. As duas barras invertidas indicam que você está se referindo .. A barra invertida é um caractere de escape.
Monkeygrinder 21/02
2
para os casos normais seria .split("match1|match2"), (por ex. split("https|http"), \\ é escapar o caractere especial) .no caso acima
prayagupd
ou geralmente, você pode usar pdfName.split("\\W");como abaixo a resposta de Peter Knego
ahmednabil88
1
use em [-.]vez de-|\\.
Saeed
49

Experimente este regex "[-.]+". O + depois trata caracteres delimitadores consecutivos como um. Remova mais se você não quiser isso.

Peter Knego
fonte
8
@Lurkers: A única razão pela qual Peter não precisou escapar disso -foi que é a primeira vez que ela pensa [], caso contrário, haveria uma barra invertida na frente dele (e, é claro, para colocar uma barra invertida na frente dele, nós precisa de dois porque esta é uma string literal).
TJ Crowder
Acho que essa resposta é melhor que a aceita, porque quando você usa o operador lógico |, o problema é que um de seus delimitadores pode fazer parte dos 'tokens' de resultado. Isso não acontecerá com [-.] +
Jack 'de
26

Você pode usar a regex "\ W". Isso corresponde a qualquer caractere que não seja da palavra. A linha necessária seria:

String[] tokens=pdfName.split("\\W");
Varun Gangal
fonte
não funciona para mim `String s =" id (INT), nome (STRING), ". Usando \\ W aqui cria uma matriz de comprimento 6, em que, uma vez que deve ser de apenas 4
user3527975
2
Isso também será interrompido quando a entrada contiver caracteres Unicode. É melhor incluir apenas o delimitador real, em vez de um "pegar tudo" com \W.
Nhhtdh 7/10
13

A string que você fornece splité a forma de string de uma expressão regular, portanto:

private void getId(String pdfName){
    String[]tokens = pdfName.split("[\\-.]");
}

Isso significa dividir qualquer caractere no [](temos que escapar -com uma barra invertida porque é especial por dentro []; e é claro que temos que escapar da barra invertida porque essa é uma string). (Por outro lado, .é normalmente especial, mas não é especial por dentro [].)

TJ Crowder
fonte
Você não precisa escapar do hífen nesse caso, porque [-.]não poderia ser interpretado como um intervalo.
Alan Moore
1
@ Alan: Porque é a primeira coisa na classe, isso é verdade. Mas sempre faço, é muito fácil voltar mais tarde e adicionar algo à frente sem pensar. Escapá-lo não custa nada, então ...
TJ Crowder
você sabe como escapar dos suportes? Eu tenho String "[200] Engenharia" que eu quero dividir em "200", "Engenharia"
scottysseus
3
Oh uau, eu entendi ... eu tive que usar duas barras invertidas em vez de uma. String[] strings = codes.get(x).split("\\[|\\]| ");<- código para qualquer pessoa interessada
scottysseus
13

Usando o Guava, você pode fazer o seguinte:

Iterable<String> tokens = Splitter.on(CharMatcher.anyOf("-.")).split(pdfName);
ColinD
fonte
4

Para duas sequências de caracteres como delímetros "AND" e "OR", isso deve ser trabalhado. Não se esqueça de aparar enquanto estiver usando.

 String text ="ISTANBUL AND NEW YORK AND PARIS OR TOKYO AND MOSCOW";
 String[] cities = text.split("AND|OR"); 

Resultado: cidades = {"ISTAMBUL", "NOVA IORQUE", "PARIS", "TÓQUIO", "MOSCOVO"}

ÖMER TAŞCI
fonte
Como posso obter uma saída como { "Istambul e", "NEW YORK E", "Paris ou", "Tóquio e", "Moscou"}
Ahamadullah Saikat
3

Eu usaria o Apache Commons:

importar org.apache.commons.lang3.StringUtils;

private void getId(String pdfName){
    String[] tokens = StringUtils.split(pdfName, "-.");
}

Ele será dividido em qualquer um dos separadores especificados, em vez de StringUtils.splitByWholeSeparator(str, separator)usar a sequência completa como um separador

Edd
fonte
3
String[] token=s.split("[.-]");
Nitish
fonte
9
Por favor, ajude a combater o mal-entendido de que o StackOverflow é um serviço gratuito de escrita de código, aumentando sua resposta somente de código com algumas explicações.
Yunnosch
2

É melhor usar algo como isto:

s.split("[\\s\\-\\.\\'\\?\\,\\_\\@]+");

Adicionaram alguns outros caracteres como amostra. Esta é a maneira mais segura de usar, porque a maneira .e 'é tratada.

Pritam Banerjee
fonte
1

Você também pode especificar expressão regular como argumento no método split () .. veja o exemplo abaixo ....

private void getId(String pdfName){
String[]tokens = pdfName.split("-|\\.");
}
Avdhesh Yadav
fonte
1

Tente este código:

var string = 'AA.BB-CC-DD.zip';
array = string.split(/[,.]/);
Ceifador
fonte
1
Por favor, ajude a combater o mal-entendido de que o StackOverflow é um serviço gratuito de escrita de código, aumentando sua resposta somente de código com algumas explicações.
Yunnosch 25/06/19
0
s.trim().split("[\\W]+") 

Deveria trabalhar.

sss
fonte
2
Primeiro, não, ele não funciona - talvez você possa experimentá-lo antes de postar? Então essa resposta é igual à sua - mas funcionando. Finalmente, você deve verificar sua formatação ( deve funcionar. ).
Arrume
1
Por favor, ajude a combater o mal-entendido de que o StackOverflow é um serviço gratuito de escrita de código, aumentando sua resposta somente de código com algumas explicações.
Yunnosch 25/06/19
-1

Se você souber que a picada sempre estará no mesmo formato, primeiro divida a string com base .e armazene-a no primeiro índice de uma variável. Em seguida, divida a sequência no segundo índice com base -e armazene os índices 0, 1 e 2. Finalmente, divida o índice 2 da matriz anterior com base em .e você deve ter obtido todos os campos relevantes.

Consulte o seguinte trecho:

String[] tmp = pdfName.split(".");
String val1 = tmp[0];
tmp = tmp[1].split("-");
String val2 = tmp[0];
...
isometrik
fonte
6
Isso pode ser feito em uma etapa, assim como em uma etapa. Veja as outras respostas.
Kaj
2
pdfName.split(".")resulta em uma matriz de comprimento zero.
Alan Moore
1) .Precisa ser evitado como #\\.
Shri