In Java come ottenere una sottostringa da una stringa fino a un carattere c?


102

Ho una stringa (che è fondamentalmente un nome di file che segue una convenzione di denominazione) abc.def.ghi

Vorrei estrarre la sottostringa prima della prima .(cioè un punto)

In Java doc api, non riesco a trovare un metodo in String che lo faccia.
Mi sto perdendo qualcosa? Come farlo?

Risposte:


64

guarda String.indexOfe String.substring.

Assicurati di controllare -1 per indexOf.


1
breve e dolce. Ricorda anche che indexOf fornisce il primo indice della sottostringa.
Neil Chowdhury

112

La risposta accettata è corretta ma non ti dice come usarla. Questo è il modo in cui usi insieme le funzioni indexOf e sottostringa.

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
Questo è un codice non valido perché non è possibile inserire una dichiarazione di variabile nel corpo di un'istruzione If senza parentesi graffe.
Clashsoft

85

Puoi semplicemente dividere la stringa ..

public String[] split(String regex)

Nota che java.lang.String.split utilizza il valore dell'espressione regolare delimitatore. Fondamentalmente così ...

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

Naturalmente, questo è diviso in più righe per la chiarezza. Potrebbe essere scritto come

String beforeFirstDot = filename.split("\\.")[0];

5
La tua proposta non è corretta, perché java.lang.String.split accetta il valore regex come attributo, non solo stringa. Tutti "." nel tuo esempio deve essere cambiato in "\\." Allora funzionerà :)
Erik Kaju

2
Adoro le espressioni regolari, ma questo mi colpisce ogni volta.
Chad Schouggins

71

Se il tuo progetto utilizza già commons-lang , StringUtils fornisce un buon metodo per questo scopo:

String filename = "abc.def.ghi";

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

vedere javadoc [2.6] [3.1]


Più pulito di altre soluzioni.
userab

12

oppure puoi provare qualcosa di simile

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


3
andrà in crash di 'c' non è nella stringa poiché indexOf restituirà -1
TofuBeer

@Umer Hayat E se il nome del file fosse def.hij.klm? Come funzionerebbe il tuo codice allora? (Il tuo codice funziona solo per questo esempio - potresti anche scrivere una funzione che ritorni "abc"- funzionerebbe altrettanto bene)
Bohemian

@ Bohemian: so che mancano casi limite e controlli. Era una risposta specifica alla domanda specifica e l'idea era di dare l'idea generale attraverso un esempio :).
Umer Hayat

1
@TofuBeer: Ok, bene, c'è una confusione prima "(cioè un punto)" non era presente nel post effettivo. Penso e spero che la mia risposta dia un'idea generale per risolvere questo problema.
Umer Hayat

2
Vorrei andare con: int ix = inString.indexOf ('.'); if (ix> -1) inString = inString.substring (0, ix); Non so perché Umer abbia suggerito di sottrarre 1. Il secondo argomento della sottostringa spetta ma escluso comunque.
Micha Berger

4

Che ne dici di usare regex?

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

Questo sostituisce tutto, dal primo punto alla fine con "" (ovvero lo cancella, lasciandoti ciò che desideri)

Ecco un test:

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

Produzione:

abc

7
Non ho votato negativamente (e sono d'accordo che fa schifo quando le persone votano in modo negativo senza motivo) ma la tua soluzione è piuttosto costosa e non super ovvia.
TofuBeer

1
@ Knickerless-Noggins posso descriverlo, se vuoi specifiche posso farlo anche io ... ma non sono sicuro di come potrei farlo in un commento (forse devo fare un'altra domanda / risposta). È costoso perché crea una stringa completamente nuova insieme a tutti i caratteri che sostituiscono. sottostringa restituisce semplicemente una vista nella stringa. Che aiuto?
TofuBeer

2
@TofuBeer hai sbagliato. Le stringhe sono immutabili . La sottostringa non restituisce una visualizzazione. Ogni String restituita da un metodo String è una nuova String.
Bohemian

@ Knickerless-Noggins Si sbaglia ... Vedi commenti recenti. Inoltre, è abbastanza efficace. La densità del codice è alta - dovrebbe essere usata intensamente per giustificare l'aggiunta di più codice per motivi di "prestazioni".
Bohemian

Apparentemente è cambiato in JDK 7, javarevisited.blogspot.ca/2011/10/…
TofuBeer

2

In java.lang.String ottieni alcuni metodi come indexOf (): che restituisce il primo indice di un carattere / stringa. e lstIndexOf: che restituisce l'ultimo indice di String / char

Da Java Doc:

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

Restituisce l'indice all'interno di questa stringa della prima occorrenza del carattere specificato.


2

Ecco il codice che restituisce una sottostringa da a Stringfino a uno qualsiasi di un dato elenco di caratteri:

/**
 * 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

Questo potrebbe aiutare:

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;
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.