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?

Respostas:


64

olhe para String.indexOfe String.substring.

Certifique-se de verificar -1 para indexOf.


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
}

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];

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]


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);


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

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.


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);
}

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;
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.