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 .
czy nie sądzisz, że zastąpi on wszystkie wystąpienia podwójnych cudzysłowów pustym ciągiem zamiast pierwszego i ostatniego.
GuruKulki
1
@ufk: To nie jest złożone wyrażenie regularne. Można inaczej chcą kłopotów z grupą 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ś?
BalusC
11
@GK daszek reprezentuje początek szukanego ciągu, a znak dolara reprezentuje jego koniec. Odwrotny ukośnik „wymyka” poniższemu cudzysłowie, więc jest traktowany jak tylko znak. Więc to wyrażenie regularne mówi, że wszystkie wystąpienia cudzysłowu na początku lub na końcu należy zastąpić pustym ciągiem. Zgodnie z prośbą.
Carl Manaster
2
@Marc: Nie jestem pewien, jaki to problem, biorąc pod uwagę pytanie w jego obecnej formie.
BalusC
8
Oto regex w podziale: ^\"|\"$. |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.
ibizaman
31
Aby usunąć pierwszy znak i ostatni znak z ciągu, użyj:
finalStringSchrodingersQuotedString="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 "partiallyi "fully"cytowanymi).
czy można przyciąć tylko jeden znak? Na przykład, jeśli mój ciąg kończy się dwoma pojedynczymi cudzysłowami, nadal chcę, aby tylko jeden cudzysłów został przycięty.
vatsal mevada
10
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.
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)}returnthis}
Istnieją setki innych języków programowania. Dlaczego dałeś odpowiedź dla Kotlina, a nie dla innych :-)?
nickolay.laptev
1
Dobre pytanie @ nickolay.laptev! :) Kiedyś pisałem java i przeniosłem się do kotlina, a ponieważ jestem programistą Androida, pomyślałem, że mogą mieć innych programistów na tym samym stanowisku, więc może to być przydatne dla nich. Ponadto removeSurrounding()metoda, którą udostępniłem powyżej, wydawała mi się łatwa do zrozumienia dla każdego programisty Java.
Ryan Amaral
1
Ta pojedyncza odpowiedź ilustruje cały sens przyjęcia Kotlina w istniejącej bazie kodu Java!
Kirill Groshkov
3
Poniższy wzorzec, użyty z java.util.regex.Matcher, dopasuje dowolny ciąg między podwójnymi cudzysłowami bez wpływu na występowanie podwójnych cudzysłowów w ciągu:
Wydaje mi się, że argument metody powinien być opatrzony adnotacją @NonNulli prawdopodobnie powinien mieć w Objects.requireNonNull(string)środku coś podobnego , ponieważ jeśli ktoś wywołuje stripQuotes (null), prawdopodobnie robi to przez pomyłkę!
brcolow
2
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.
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.
Odpowiedzi:
Możesz użyć
String#replaceAll()
z wzorem^\"|\"$
do tego .Na przykład
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 .
źródło
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:
źródło
Również z Apache
StringUtils.strip()
:Więc,
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).źródło
Jeśli podwójne cudzysłowy istnieją tylko na początku i na końcu, prosty kod działałby idealnie:
string = string.replace("\"", "");
źródło
To najlepszy sposób, jaki znalazłem, na usuwanie podwójnych cudzysłowów z początku i końca ciągu.
źródło
Używając guawy, możesz pisać bardziej elegancko
CharMatcher.is('\"').trimFrom(mystring);
źródło
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.
źródło
Kotlin
W Kotlinie możesz użyć String.removeSurrounding (delimiter: CharSequence)
Na przykład
Kod źródłowy wygląda następująco:
źródło
removeSurrounding()
metoda, którą udostępniłem powyżej, wydawała mi się łatwa do zrozumienia dla każdego programisty Java.Poniższy wzorzec, użyty z
java.util.regex.Matcher
, dopasuje dowolny ciąg między podwójnymi cudzysłowami bez wpływu na występowanie podwójnych cudzysłowów w ciągu:źródło
Trochę modyfikuję odpowiedź @ brcolow
źródło
@NonNull
i prawdopodobnie powinien mieć wObjects.requireNonNull(string)
środku coś podobnego , ponieważ jeśli ktoś wywołuje stripQuotes (null), prawdopodobnie robi to przez pomyłkę!Scala
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
źródło
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.
źródło
źródło
źródło
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:
Jeśli chcesz usunąć również pojedyncze cudzysłowy:
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 :
źródło
znajdź indeksy każdego podwójnego cudzysłowu i wstaw tam pusty ciąg.
źródło