Odpowiedzi:
Możesz użyć String#replaceAll()
z wzorem^\"|\"$
do tego .
Na przykład
string = string.replaceAll("^\"|\"$", "");
Aby dowiedzieć się więcej o wyrażeniach regularnych, wejdź na http://regular-expression.info .
To powiedziawszy, pachnie trochę tak, jakbyś próbował wymyślić parser CSV. Jeśli tak, proponuję rozejrzeć się za istniejącymi bibliotekami, takimi jak OpenCSV .
String#indexOf()
, String#substring()
metody i tak dalej. Jest tylko odrobinę szybszy, ale zawiera znacznie więcej kodu. @GK: Uh, czy przeczytałeś / zrozumiałeś wyrażenie regularne lub nawet je przetestowałeś?
^\"|\"$
. |
oznacza „lub”. W ten sposób będzie pasować albo ^\"
lub \"$
. ^
dopasowuje początek ciągu i $
koniec ciągu. ^\"
oznacza dopasowanie cudzysłowu na początku ciągu i \"$
dopasowuje cudzysłów na końcu ciągu.
Aby usunąć pierwszy znak i ostatni znak z ciągu, użyj:
myString = myString.substring(1, myString.length()-1);
Również z 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"
Więc,
final String SchrodingersQuotedString = "may or may not be quoted";
StringUtils.strip(SchrodingersQuotedString, "\""); //quoted no more
Ta metoda działa zarówno z ciągami cytowanymi, jak i niecytowanymi, jak pokazano w moim przykładzie. Jedynym minusem jest to, że nie będzie szukał ściśle dopasowanych cudzysłowów, a jedynie początkowe i końcowe znaki cudzysłowu (tj. Brak rozróżnienia między łańcuchami cytowanymi "partially
i "fully"
cytowanymi).
Jeśli podwójne cudzysłowy istnieją tylko na początku i na końcu, prosty kod działałby idealnie:
string = string.replace("\"", "");
To najlepszy sposób, jaki znalazłem, na usuwanie podwójnych cudzysłowów z początku i końca ciągu.
someString.replace (/(^")|("$)/g, '')
Używając guawy, możesz pisać bardziej elegancko CharMatcher.is('\"').trimFrom(mystring);
Najpierw sprawdzamy, czy ciąg znaków jest podwójnie cytowany, a jeśli tak, usuwamy go. Możesz pominąć warunek, jeśli w rzeczywistości wiesz, że jest on podwójnie cytowany.
if (string.length() >= 2 && string.charAt(0) == '"' && string.charAt(string.length() - 1) == '"')
{
string = string.substring(1, string.length() - 1);
}
W Kotlinie możesz użyć String.removeSurrounding (delimiter: CharSequence)
Na przykład
string.removeSurrounding("\"")
Usuwa podany ciąg separatora zarówno z początku, jak i końca tego ciągu wtedy i tylko wtedy, gdy zaczyna się od separatora i kończy się nim . W przeciwnym razie zwraca ten ciąg bez zmian.
Kod źródłowy wygląda następująco:
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
}
removeSurrounding()
metoda, którą udostępniłem powyżej, wydawała mi się łatwa do zrozumienia dla każdego programisty Java.
Trochę modyfikuję odpowiedź @ brcolow
if (string != null && string.length() >= 2 && string.startsWith("\"") && string.endsWith("\"") {
string = string.substring(1, string.length() - 1);
}
@NonNull
i prawdopodobnie powinien mieć w Objects.requireNonNull(string)
środku coś podobnego , ponieważ jeśli ktoś wywołuje stripQuotes (null), prawdopodobnie robi to przez pomyłkę!
Scala
s.stripPrefix("\"").stripSuffix("\"")
Działa to niezależnie od tego, czy ciąg ma cudzysłowy na początku i / lub na końcu, czy nie.
Edycja: Przepraszamy, tylko Scala
Edytowano: Właśnie zdałem sobie sprawę, że powinienem określić, że działa to tylko wtedy, gdy oba istnieją. W przeciwnym razie ciąg nie jest cytowany. Taki scenariusz pojawił się u mnie podczas pracy z plikami 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\""
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;
}
Aby usunąć jeden lub więcej podwójnych cudzysłowów z początku i końca ciągu w Javie, musisz użyć rozwiązania opartego na wyrażeniach regularnych:
String result = input_str.replaceAll("^\"+|\"+$", "");
Jeśli chcesz usunąć również pojedyncze cudzysłowy:
String result = input_str.replaceAll("^[\"']+|[\"']+$", "");
UWAGA : Jeśli twój ciąg zawiera "
wewnątrz, takie podejście może prowadzić do problemów (np. "Name": "John"
=>Name": "John
).
Zobacz demo Java tutaj :
String input_str = "\"'some string'\"";
String result = input_str.replaceAll("^[\"']+|[\"']+$", "");
System.out.println(result); // => some string