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 .
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:
finalStringSchrodingersQuotedString="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).
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.
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.
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)}returnthis}
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:
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.
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.
Antworten:
Sie können
String#replaceAll()
mit einem Muster^\"|\"$
dafür verwenden.Z.B
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 .
quelle
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?^\"|\"$
.|
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.Verwenden Sie: Entfernen Sie das erste und das letzte Zeichen aus der Zeichenfolge:
quelle
Auch mit Apache
StringUtils.strip()
:So,
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
"partially
und"fully"
Anführungszeichen).quelle
Wenn die doppelten Anführungszeichen nur am Anfang und am Ende existieren, würde ein einfacher Code wie dieser perfekt funktionieren:
string = string.replace("\"", "");
quelle
Dies ist der beste Weg, doppelte Anführungszeichen vom Anfang und Ende eines Strings zu entfernen.
quelle
Mit Guava können Sie eleganter schreiben
CharMatcher.is('\"').trimFrom(mystring);
quelle
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.
quelle
Kotlin
In Kotlin können Sie verwenden String.removeSurrounding verwenden (Trennzeichen: CharSequence)
Z.B
Der Quellcode sieht folgendermaßen aus:
quelle
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.Das folgende Muster stimmt bei Verwendung mit einer
java.util.regex.Matcher
beliebigen Zeichenfolge zwischen doppelten Anführungszeichen überein, ohne das Auftreten von doppelten Anführungszeichen innerhalb der Zeichenfolge zu beeinflussen:quelle
Ändern Sie die Antwort von @ brcolow ein wenig
quelle
@NonNull
sollte und wahrscheinlich etwas Ähnliches enthalten sollteObjects.requireNonNull(string)
, denn wenn jemand stripQuotes (null) aufruft, tut er dies wahrscheinlich versehentlich!Scala
Dies funktioniert unabhängig davon, ob die Zeichenfolge am Anfang und / oder am Ende Anführungszeichen enthält oder nicht.
Edit: Sorry, nur Scala
quelle
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.
quelle
quelle
quelle
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:
Wenn Sie auch einfache Anführungszeichen entfernen müssen:
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 :
quelle
Suchen Sie die Indizes der einzelnen Anführungszeichen und fügen Sie dort eine leere Zeichenfolge ein.
quelle