Em java, como obter substring de uma string até um caractere c?

102

Eu tenho uma string (que é basicamente um nome de arquivo seguindo uma convenção de nomenclatura) abc.def.ghi

Eu gostaria de extrair a substring antes da primeira .(ou seja, um ponto)

Em java doc api, não consigo encontrar um método em String que faça isso.
Estou esquecendo de algo? Como fazer isso?

xyz
fonte

Respostas:

64

olhe para String.indexOfe String.substring.

Certifique-se de verificar -1 para indexOf.

TofuBeer
fonte
1
curto e grosso. Lembre-se também de que indexOf fornece o primeiro índice da substring.
Neil Chowdhury
112

A resposta aceita está correta, mas não informa como usá-la. É assim que você usa as funções indexOf e substring juntas.

String filename = "abc.def.ghi";     // full file name
int iend = filename.indexOf("."); //this finds the first occurrence of "." 
//in string thus giving you the index of where it is in the string

// Now iend can be -1, if lets say the string had no "." at all in it i.e. no "." is found. 
//So check and account for it.

String subString;
if (iend != -1) 
{
    subString= filename.substring(0 , iend); //this will give abc
}
Sam B
fonte
1
Este é um código inválido porque você não pode colocar uma declaração de variável no corpo de uma instrução If sem chaves.
Clashsoft
85

Você pode apenas dividir a corda ..

public String[] split(String regex)

Observe que java.lang.String.split usa o valor da expressão regular do delimitador. Basicamente assim ...

String filename = "abc.def.ghi";     // full file name
String[] parts = filename.split("\\."); // String array, each element is text between dots

String beforeFirstDot = parts[0];    // Text before the first dot

Claro, isso é dividido em várias linhas para claridade. Pode ser escrito como

String beforeFirstDot = filename.split("\\.")[0];
Chad Schouggins
fonte
5
Sua proposta não está correta, porque java.lang.String.split leva o valor regex como atributo, não apenas string. Tudo "." no seu exemplo precisa ser alterado para "\\." Então funcionará :)
Erik Kaju
2
Eu amo regex, mas isso me pega sempre.
Chad Schouggins
71

Se o seu projeto já usa commons-lang , StringUtils fornece um bom método para essa finalidade:

String filename = "abc.def.ghi";

String start = StringUtils.substringBefore(filename, "."); // returns "abc"

veja javadoc [2.6] [3.1]

Max Fichtelmann
fonte
Mais limpo do que outras soluções.
userab
12

ou você pode tentar algo como

"abc.def.ghi".substring(0,"abc.def.ghi".indexOf(c)-1);

Umer Hayat
fonte
3
irá travar de 'c' não está na string, pois indexOf retornará -1
TofuBeer
@Umer Hayat E se o nome do arquivo for def.hij.klm? Como o seu código funcionaria então? (Seu código só funciona para este exemplo - você também pode escrever uma função que retorne "abc"- funcionaria da mesma forma)
Boêmio
@Bohemian: Eu sei que faltam casos e verificações de limite. Era uma resposta específica para a pergunta específica e a ideia era dar a ideia geral através de um exemplo :).
Umer Hayat,
1
@TofuBeer: Ok, bom, há uma confusão anterior "(ou seja, um ponto)" não estava lá na postagem real. Eu penso e espero que minha resposta dê uma idéia geral para resolver esse tipo de problema.
Umer Hayat,
2
Eu iria com: int ix = inString.indexOf ('.'); if (ix> -1) inString = inString.substring (0, ix); Não sei por que Umer sugeriu subtrair 1. O segundo argumento de substring é até, mas exclui de qualquer maneira.
Micha Berger de
4

Que tal usar regex?

String firstWord = filename.replaceAll("\\..*","")

Isso substitui tudo, do primeiro ponto ao final por "" (ou seja, ele o limpa, deixando você com o que deseja)

Aqui está um teste:

System.out.println("abc.def.hij".replaceAll("\\..*", "");

Resultado:

abc
Boêmio
fonte
7
Eu não fiz downvote (e concordo que é uma pena quando as pessoas fazem downvote sem motivo), mas sua solução é muito cara e não é muito óbvia.
TofuBeer,
1
@ Knickerless-Noggins eu posso descrever, se você quiser detalhes, eu posso fazer isso também ... mas não tenho certeza de como faria em um comentário (talvez tenha que fazer outra pergunta / resposta). É caro porque cria uma string totalmente nova junto com todos os caracteres de substituição. substring simplesmente retorna uma visão da string. Isso ajuda?
TofuBeer
2
@TofuBeer você está incorreto. Strings são imutáveis . Substring não retorna uma visualização. Cada String retornada de um método String é uma nova String.
Bohemian
@ Knickerless-Noggins Ele está enganado ... Ver comentários recentes. Além disso, é eficiente o suficiente. A densidade do código é alta - ele teria que ser usado intensamente para justificar a adição de mais código por causa do "desempenho".
Boêmio
Aparentemente, mudou no JDK 7, javarevisited.blogspot.ca/2011/10/…
TofuBeer
2

Em java.lang.String, você obtém alguns métodos como indexOf (): que retorna o primeiro índice de um char / string. e lstIndexOf: que retorna o último índice de String / char

Do Java Doc:

  public int indexOf(int ch)
  public int indexOf(String str)

Retorna o índice dentro desta string da primeira ocorrência do caractere especificado.

Swagatika
fonte
2

Aqui está o código que retorna uma substring de a Stringaté qualquer um de uma determinada lista de caracteres:

/**
 * Return a substring of the given original string until the first appearance
 * of any of the given characters.
 * <p>
 * e.g. Original "ab&cd-ef&gh"
 * 1. Separators {'&', '-'}
 * Result: "ab"
 * 2. Separators {'~', '-'}
 * Result: "ab&cd"
 * 3. Separators {'~', '='}
 * Result: "ab&cd-ef&gh"
 *
 * @param original   the original string
 * @param characters the separators until the substring to be considered
 * @return the substring or the original string of no separator exists
 */
public static String substringFirstOf(String original, List<Character> characters) {
    return characters.stream()
            .map(original::indexOf)
            .filter(min -> min > 0)
            .reduce(Integer::min)
            .map(position -> original.substring(0, position))
            .orElse(original);
}
m3th0dman
fonte
1

Isso pode ajudar:

public static String getCorporateID(String fileName) {

    String corporateId = null;

    try {
        corporateId = fileName.substring(0, fileName.indexOf("_"));
        // System.out.println(new Date() + ": " + "Corporate:
        // "+corporateId);
        return corporateId;
    } catch (Exception e) {
        corporateId = null;
        e.printStackTrace();
    }

    return corporateId;
}
Vinod Moyal
fonte