Wie kann ich beginnende und endende doppelte Anführungszeichen aus einer Zeichenfolge entfernen?

138

Ich möchte ein doppeltes Anführungszeichen (") am Anfang und am Ende eines Strings abschneiden.
Wie kann ich das in Java erreichen? Danke!

ufk
quelle
1
Ist bekannt, dass die Zeichenfolge Anführungszeichen enthält, oder ist die Suche nach Anführungszeichen Teil des Problems?
Michael Myers

Antworten:

249

Sie können String#replaceAll()mit einem Muster ^\"|\"$dafür verwenden.

Z.B

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

Weitere Informationen zu regulären Ausdrücken finden Sie unter http://regular-expression.info .

Das riecht ein bisschen so, als würden Sie versuchen, einen CSV-Parser zu erfinden. In diesem Fall würde ich vorschlagen, sich nach vorhandenen Bibliotheken wie OpenCSV umzusehen .

BalusC
quelle
6
Glauben Sie nicht, dass es alle Vorkommen von doppelten Anführungszeichen durch eine leere Zeichenfolge ersetzt, anstatt die erste und die letzte.
GuruKulki
1
@ufk: Dies ist kein komplexer regulärer Ausdruck. Sie können sonst mit einem Bündel von zu Ärger wollen String#indexOf(), String#substring()Methoden und so weiter. Es ist nur ein bisschen schneller, aber es ist viel mehr Code. @GK: Äh, hast du den Regex gelesen / verstanden oder sogar getestet?
BalusC
11
@GK das Caret repräsentiert den Anfang der gesuchten Zeichenfolge und das Dollarzeichen repräsentiert das Ende. Der Backslash hier "entgeht" dem folgenden Zitat, sodass es nur als Zeichen behandelt wird. In diesem regulären Ausdruck heißt es also, alle Vorkommen von Anführungszeichen am Anfang oder Anführungszeichen am Ende durch die leere Zeichenfolge zu ersetzen. Genau wie gewünscht.
Carl Manaster
2
@Marc: Ich bin mir nicht sicher, wie das ein Problem ist, wenn man die Frage in ihrer aktuellen Form betrachtet.
BalusC
8
Hier ist die Regex aufgeschlüsselt : ^\"|\"$. |bedeutet "oder". Es wird also entweder ^\"oder übereinstimmen \"$. ^Entspricht dem Anfang der Zeichenfolge und dem $Ende der Zeichenfolge. ^\"bedeutet, dass ein Anführungszeichen am Anfang der Zeichenfolge und \"$ein Anführungszeichen am Ende der Zeichenfolge übereinstimmt.
Ibizaman
31

Verwenden Sie: Entfernen Sie das erste und das letzte Zeichen aus der Zeichenfolge:

myString = myString.substring(1, myString.length()-1);
Michael Myers
quelle
18
Dies setzt lediglich voraus, dass die Angebote garantiert vorhanden sind. Wenn es keine Garantie gibt, müssen Sie diese vorher überprüfen.
BalusC
4
@ BalusC: Auf jeden Fall. Aus meiner Lektüre der Frage geht hervor, dass die Zeichenfolge bereits mit Anführungszeichen versehen ist.
Michael Myers
Länge ist eine Eigenschaft, keine Funktion
Martin
2
@Martin: .length ist eine Eigenschaft von Arrays, aber .length () ist eine Methode von Strings.
Michael Myers
@ MichaelMyers: Ups, tut mir leid, ich war im mentalen JavaScript-Modus. Mein Fehler.
Martin
16

Auch mit 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"

So,

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

Diese Methode funktioniert sowohl mit Zeichenfolgen in Anführungszeichen als auch in Zeichenfolgen ohne Anführungszeichen, wie in meinem Beispiel gezeigt. Der einzige Nachteil ist, dass nicht nach streng übereinstimmenden Anführungszeichen gesucht wird, sondern nur nach führenden und nachfolgenden Anführungszeichen (dh keine Unterscheidung zwischen "partiallyund "fully"Anführungszeichen).

rath
quelle
13

Wenn die doppelten Anführungszeichen nur am Anfang und am Ende existieren, würde ein einfacher Code wie dieser perfekt funktionieren:

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

sunraincyq
quelle
13

Dies ist der beste Weg, doppelte Anführungszeichen vom Anfang und Ende eines Strings zu entfernen.

someString.replace (/(^")|("$)/g, '')
Yaniv Levi
quelle
2
Fügen Sie möglicherweise auch einfache Anführungszeichen hinzu, um (/ (^ \ "| \ ') | (\" | \' $) / g, "") zu ersetzen.
Bob
11

Mit Guava können Sie eleganter schreiben CharMatcher.is('\"').trimFrom(mystring);

legrass
quelle
2
ist es möglich, nur einzelne Zeichen zu trimmen? Wenn meine Zeichenfolge beispielsweise immer noch mit zwei einfachen Anführungszeichen endet, möchte ich, dass nur einfache Anführungszeichen gekürzt werden.
Vatsal Mevada
10

Zuerst prüfen wir, ob der String doppelt in Anführungszeichen gesetzt ist, und entfernen ihn gegebenenfalls. Sie können die Bedingung überspringen, wenn Sie tatsächlich wissen, dass sie doppelt in Anführungszeichen steht.

if (string.length() >= 2 && string.charAt(0) == '"' && string.charAt(string.length() - 1) == '"')
{
    string = string.substring(1, string.length() - 1);
}
brcolow
quelle
Dies ist die um Größenordnungen performanteste Antwort und gibt sogar an, was in Bezug auf das optionale oder nicht vorhandene Vorhandensein der Anführungszeichen zu tun ist.
Entonio
6

Kotlin

In Kotlin können Sie verwenden String.removeSurrounding verwenden (Trennzeichen: CharSequence)

Z.B

string.removeSurrounding("\"")

Entfernt die angegebene Trennzeichenfolge sowohl vom Anfang als auch vom Ende dieser Zeichenfolge genau dann, wenn sie mit dem Trennzeichen beginnt und mit diesem endet . Andernfalls wird diese Zeichenfolge unverändert zurückgegeben.

Der Quellcode sieht folgendermaßen aus:

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
}
Ryan Amaral
quelle
Es gibt Hunderte anderer Programmiersprachen. Warum hast du die Antwort für Kotlin und nicht für andere gegeben :-)?
nickolay.laptev
1
Gute Frage @ nickolay.laptev! :) Ich habe Java geschrieben und bin zu Kotlin gewechselt. Da ich ein Android-Entwickler bin, dachte ich, dass sich möglicherweise andere Entwickler in derselben Position befinden, sodass dies auch für sie nützlich sein könnte. Auch die removeSurrounding()Methode , die ich oben geteilt habe, sah für mich so aus, dass sie für jeden Java-Entwickler leicht verständlich sein könnte.
Ryan Amaral
1
Diese einzige Antwort zeigt, wie wichtig es ist, Kotlin in Ihre vorhandene Java-Codebasis zu übernehmen!
Kirill Groshkov
3

Das folgende Muster stimmt bei Verwendung mit einer java.util.regex.Matcherbeliebigen Zeichenfolge zwischen doppelten Anführungszeichen überein, ohne das Auftreten von doppelten Anführungszeichen innerhalb der Zeichenfolge zu beeinflussen:

"[^\"][\\p{Print}]*[^\"]"
Alex F.
quelle
2

Ändern Sie die Antwort von @ brcolow ein wenig

if (string != null && string.length() >= 2 && string.startsWith("\"") && string.endsWith("\"") {
    string = string.substring(1, string.length() - 1);
}
Verwirrt
quelle
Ich würde denken, dass das Methodenargument mit Anmerkungen versehen sein @NonNullsollte und wahrscheinlich etwas Ähnliches enthalten sollte Objects.requireNonNull(string), denn wenn jemand stripQuotes (null) aufruft, tut er dies wahrscheinlich versehentlich!
Brcolow
2

Scala

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

Dies funktioniert unabhängig davon, ob die Zeichenfolge am Anfang und / oder am Ende Anführungszeichen enthält oder nicht.

Edit: Sorry, nur Scala

Brendan Maguire
quelle
2

Bearbeitet: Ich habe gerade festgestellt, dass ich angeben sollte, dass dies nur funktioniert, wenn beide vorhanden sind. Andernfalls wird die Zeichenfolge nicht als Anführungszeichen betrachtet. Ein solches Szenario erschien mir bei der Arbeit mit CSV-Dateien.

org.apache.commons.lang3.StringUtils.unwrap("\"abc\"", "\"")    = "abc"
org.apache.commons.lang3.StringUtils.unwrap("\"abc", "\"")    = "\"abc"
org.apache.commons.lang3.StringUtils.unwrap("abc\"", "\"")    = "abc\""
Rosercostin
quelle
1
Matcher m = Pattern.compile("^\"(.*)\"$").matcher(value);
String strUnquoted = value;
if (m.find()) {
    strUnquoted = m.group(1);
}
Ravikiran
quelle
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;
}
m0untp
quelle
1

Um ein oder mehrere doppelte Anführungszeichen am Anfang und Ende eines Strings in Java zu entfernen, müssen Sie eine Regex-basierte Lösung verwenden:

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

Wenn Sie auch einfache Anführungszeichen entfernen müssen:

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

HINWEIS : Wenn Ihre Zeichenfolge "Inside enthält , kann dieser Ansatz zu Problemen führen (z. B. "Name": "John"=>Name": "John . ).

Sehen Sie hier eine Java-Demo :

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

Suchen Sie die Indizes der einzelnen Anführungszeichen und fügen Sie dort eine leere Zeichenfolge ein.

GuruKulki
quelle
Es sollte also der erste Index und der letzte Index der doppelten Qoute sein.
GuruKulki