Come posso tagliare l'inizio e la fine tra virgolette doppie di una stringa?


139

Vorrei tagliare una doppia virgoletta iniziale (e) (") da una stringa.
Come posso realizzarla in Java? Grazie!


1
È già noto che la stringa contiene virgolette o il controllo delle virgolette fa parte del problema?
Michael Myers

Risposte:


250

È possibile utilizzare String#replaceAll()con un modello di ^\"|\"$per questo.

Per esempio

string = string.replaceAll("^\"|\"$", "");

Per ulteriori informazioni sulle espressioni regolari, consultare http://regular-expression.info .

Detto questo, questo puzza un po 'come se stessi cercando di inventare un parser CSV. In tal caso, suggerirei di cercare le librerie esistenti, come OpenCSV .


6
non pensi che sostituirà tutte le occorrenze di virgolette doppie con una stringa vuota piuttosto che la prima e l'ultima.
GuruKulki,

1
@ufk: questa non è una regex complessa. È altrimenti consiglia di problemi con un gruppo di String#indexOf(), String#substring(), metodi e così via. È solo un po 'più veloce, ma è molto più codice. @GK: Uh, hai letto / capito il regex o addirittura lo hai provato?
BalusC

11
@GK il punto di inserimento rappresenta l'inizio della stringa cercata e il simbolo del dollaro ne rappresenta la fine. La barra rovesciata qui "sfugge" alla seguente citazione, quindi viene trattata come solo un personaggio. Quindi questa regex dice, sostituisci tutte le occorrenze di virgoletta all'inizio, o virgolette alla fine, con la stringa vuota. Proprio come richiesto.
Carl Manaster,

2
@Marc: Non sono sicuro di come sia un problema considerando la domanda nella sua forma attuale.
BalusC,

8
Ecco l'espressione regolare ripartiti: ^\"|\"$. |significa "o". Quindi corrisponderà a ^\"o \"$. ^corrisponde all'inizio della stringa e $corrisponde alla fine della stringa. ^\"significa abbinare una virgoletta all'inizio della stringa e abbinare una virgoletta alla \"$fine della stringa.
ibizaman,

31

Per rimuovere il primo carattere e l'ultimo carattere dalla stringa, utilizzare:

myString = myString.substring(1, myString.length()-1);

18
Ciò richiede solo che le offerte siano garantite . Se non esiste alcuna garanzia, è necessario verificarlo prima.
BalusC

4
@BalusC: Certamente. Dalla mia lettura della domanda, sembra che la stringa abbia già delle virgolette attorno.
Michael Myers

.length è una proprietà non una funzione
Martin,

2
@Martin: .length è una proprietà di array, ma .length () è un metodo di stringhe.
Michael Myers

@MichaelMyers: Oops, scusa se ero in modalità JavaScript mentale. Errore mio.
Martin,

16

Anche con Apache StringUtils.strip():

 StringUtils.strip(null, *)          = null
 StringUtils.strip("", *)            = ""
 StringUtils.strip("abc", null)      = "abc"
 StringUtils.strip("  abc", null)    = "abc"
 StringUtils.strip("abc  ", null)    = "abc"
 StringUtils.strip(" abc ", null)    = "abc"
 StringUtils.strip("  abcyx", "xyz") = "  abc"

Così,

final String SchrodingersQuotedString = "may or may not be quoted";
StringUtils.strip(SchrodingersQuotedString, "\""); //quoted no more

Questo metodo funziona con stringhe tra virgolette e non quotate come mostrato nel mio esempio. L'unico aspetto negativo è che non cercherà le virgolette strettamente abbinate , ma solo i caratteri delle virgolette iniziali e finali (ovvero nessuna distinzione tra stringhe tra virgolette "partiallye "fully"stringhe).


13

Se le doppie virgolette esistono solo all'inizio e alla fine, un semplice codice come questo funzionerebbe perfettamente:

string = string.replace("\"", "");


13

Questo è il modo migliore che ho trovato per eliminare le doppie virgolette dall'inizio e dalla fine di una stringa.

someString.replace (/(^")|("$)/g, '')

2
Forse includi anche virgolette singole sostituisci (/ (^ \ "| \ ') | (\" | \' $) / g, "");
bob

11

Usando Guava puoi scrivere in modo più elegante CharMatcher.is('\"').trimFrom(mystring);


2
è possibile tagliare solo un personaggio? Ad esempio, se la mia stringa termina con due virgolette singole, desidero comunque tagliare solo una virgoletta singola.
vatsal mevada,

10

Innanzitutto, controlliamo se la stringa è raddoppiata tra virgolette e, in tal caso, rimuoverla. Puoi saltare il condizionale se in realtà sai che è tra virgolette doppie.

if (string.length() >= 2 && string.charAt(0) == '"' && string.charAt(string.length() - 1) == '"')
{
    string = string.substring(1, string.length() - 1);
}

Questa è la risposta più efficace per ordini di grandezza e specifica anche cosa fare riguardo alla presenza facoltativa o meno delle virgolette.
entonio,

6

Kotlin

In Kotlin puoi usare String.removeSurrounding (delimitatore: CharSequence)

Per esempio

string.removeSurrounding("\"")

Rimuove la stringa del delimitatore specificata sia dall'inizio che dalla fine di questa stringa se e solo se inizia con e termina con il delimitatore . Altrimenti restituisce questa stringa invariata.

Il codice sorgente è simile al seguente:

public fun String.removeSurrounding(delimiter: CharSequence): String = removeSurrounding(delimiter, delimiter)

public fun String.removeSurrounding(prefix: CharSequence, suffix: CharSequence): String {
    if ((length >= prefix.length + suffix.length) && startsWith(prefix) && endsWith(suffix)) {
        return substring(prefix.length, length - suffix.length)
    }
    return this
}

Esistono centinaia di altri linguaggi di programmazione. Perché hai fornito la risposta per Kotlin e non per gli altri :-)?
nickolay.laptev,

1
Bella domanda @ nickolay.laptev! :) Scrivevo java e mi sono trasferito in kotlin e dato che sono uno sviluppatore Android ho pensato che potrebbero avere altri sviluppatori nella stessa posizione, quindi potrebbe essere utile anche per loro. Inoltre, il removeSurrounding()metodo che ho condiviso sopra mi sembrava che potesse essere facilmente comprensibile da qualsiasi sviluppatore Java.
Ryan Amaral,

1
Questa singola risposta illustra l'intero punto dell'adozione di Kotlin nella tua base di codice Java esistente!
Kirill Groshkov,

3

Lo schema seguente, se utilizzato con java.util.regex.Matcher, abbinerà qualsiasi stringa tra virgolette doppie senza influire sulle occorrenze di virgolette doppie all'interno della stringa:

"[^\"][\\p{Print}]*[^\"]"

2

Modificando un po 'la risposta di @ brcolow

if (string != null && string.length() >= 2 && string.startsWith("\"") && string.endsWith("\"") {
    string = string.substring(1, string.length() - 1);
}

Penserei che l'argomento del metodo dovrebbe essere annotato @NonNulle probabilmente dovrebbe avere qualcosa di simile Objects.requireNonNull(string)al suo interno perché se qualcuno sta chiamando stripQuotes (null) probabilmente lo stanno facendo per errore!
brcolow,

2

Scala

s.stripPrefix("\"").stripSuffix("\"")

Funziona indipendentemente dal fatto che la stringa abbia o meno virgolette all'inizio e / o alla fine.

Modifica: scusate, solo Scala


2

A cura: ho appena capito che dovrei specificare che funziona solo se esistono entrambi. Altrimenti la stringa non viene considerata quotata. Tale scenario mi è apparso quando ho lavorato con file CSV.

org.apache.commons.lang3.StringUtils.unwrap("\"abc\"", "\"")    = "abc"
org.apache.commons.lang3.StringUtils.unwrap("\"abc", "\"")    = "\"abc"
org.apache.commons.lang3.StringUtils.unwrap("abc\"", "\"")    = "abc\""

1
Matcher m = Pattern.compile("^\"(.*)\"$").matcher(value);
String strUnquoted = value;
if (m.find()) {
    strUnquoted = m.group(1);
}

1
private static String removeQuotesFromStartAndEndOfString(String inputStr) {
    String result = inputStr;
    int firstQuote = inputStr.indexOf('\"');
    int lastQuote = result.lastIndexOf('\"');
    int strLength = inputStr.length();
    if (firstQuote == 0 && lastQuote == strLength - 1) {
        result = result.substring(1, strLength - 1);
    }
    return result;
}

1

Per rimuovere una o più virgolette dall'inizio e dalla fine di una stringa in Java, è necessario utilizzare una soluzione basata su regex:

String result = input_str.replaceAll("^\"+|\"+$", "");

Se è necessario rimuovere anche virgolette singole:

String result = input_str.replaceAll("^[\"']+|[\"']+$", "");

NOTA : se la stringa contiene "all'interno, questo approccio potrebbe causare problemi (ad es. "Name": "John"=>Name": "John ).

Guarda una demo Java qui :

String input_str = "\"'some string'\"";
String result = input_str.replaceAll("^[\"']+|[\"']+$", "");
System.out.println(result); // => some string

0

trova gli indici di ogni virgoletta doppia e inserisci una stringa vuota lì.


quindi dovrebbe essere il primo indice e l'ultimo indice del doppio qoute.
GuruKulki,
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.