Meskipun demikian, baunya seperti Anda mencoba menciptakan parser CSV. Jika demikian, saya sarankan untuk melihat-lihat perpustakaan yang ada, seperti OpenCSV .
tidakkah menurut Anda itu akan menggantikan semua kemunculan tanda kutip ganda dengan string kosong daripada yang pertama dan terakhir.
GuruKulki
1
@ufk: Ini bukan regex yang kompleks. Anda sebaliknya mungkin ingin repot dengan sekelompok String#indexOf(), String#substring(), metode dan sebagainya. Ini hanya sedikit lebih cepat, tetapi lebih banyak kode. @GK: Eh, apakah Anda membaca / memahami regex atau bahkan mengujinya?
BalusC
12
@GK tanda sisipan mewakili awal dari string yang dicari, dan tanda dolar mewakili akhirnya. Garis miring terbalik di sini "mengesampingkan" kutipan berikut sehingga diperlakukan hanya sebagai karakter. Jadi ekspresi reguler ini mengatakan, ganti semua kemunculan kutipan di awal, atau kutipan di akhir, dengan string kosong. Seperti yang diminta.
Carl Manaster
2
@ Marc: Saya tidak yakin bagaimana itu menjadi masalah mengingat pertanyaan dalam bentuknya saat ini.
BalusC
8
Berikut adalah regex rusak: ^\"|\"$. |berarti "atau". Dengan demikian akan cocok dengan salah satu ^\"atau \"$. ^cocok dengan awal string dan $cocok dengan akhir string. ^\"Berarti cocok dengan kutipan di awal string dan \"$cocok dengan kutipan di akhir string.
ibizaman
32
Untuk menghapus karakter pertama dan karakter terakhir dari string, gunakan:
final String SchrodingersQuotedString = "may or may not be quoted";
StringUtils.strip(SchrodingersQuotedString, "\""); //quoted no more
Metode ini berfungsi baik dengan string yang dikutip dan tidak dikutip seperti yang ditunjukkan dalam contoh saya. Satu-satunya downside adalah, itu tidak akan mencari kutipan yang benar-benar cocok , hanya karakter kutipan di depan dan di belakang (yaitu, tidak ada perbedaan antara "partiallydan "fully"kutipan string).
apakah mungkin untuk memangkas hanya satu karakter? Misalnya jika string saya diakhiri dengan dua tanda kutip tunggal, saya hanya ingin kutipan tunggal dipangkas.
vatsal mevada
10
Pertama, kami memeriksa untuk melihat apakah String dikutip dua kali lipat, dan jika demikian, hapus mereka. Anda dapat melewati persyaratan jika sebenarnya Anda tahu itu dikutip ganda.
Ini adalah jawaban yang paling berkinerja berdasarkan urutan besarnya dan bahkan menentukan apa yang harus dilakukan berkenaan dengan opsional atau tidak adanya tanda kutip.
Menghapus string pembatas yang diberikan dari awal dan akhir string ini jika dan hanya jika diawali dengan dan diakhiri dengan pembatas . Jika tidak, kembalikan string ini tidak berubah.
Kode sumbernya terlihat seperti ini:
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
}
Ada ratusan bahasa pemrograman lainnya. Mengapa Anda memberikan jawaban untuk Kotlin dan bukan untuk yang lain :-)?
nickolay.laptev
3
Pertanyaan bagus @ nickolay.laptev! :) Saya biasa menulis java dan saya pindah ke kotlin dan karena saya adalah pengembang android, saya pikir mungkin ada pengembang lain di posisi yang sama sehingga ini bisa bermanfaat bagi mereka juga. Juga, removeSurrounding()metode yang saya bagikan di atas menurut saya dapat dengan mudah dimengerti oleh pengembang java mana pun.
Ryan Amaral
1
Jawaban tunggal ini menggambarkan keseluruhan tujuan dari mengadopsi Kotlin di basis kode Java Anda yang sudah ada!
Kirill Groshkov
3
Pola di bawah ini, saat digunakan dengan java.util.regex.Matcher, akan cocok dengan string apa pun di antara tanda kutip ganda tanpa memengaruhi kemunculan tanda kutip ganda di dalam string:
Saya akan berpikir bahwa argumen metode harus diberi anotasi @NonNulldan mungkin harus memiliki sesuatu seperti Objects.requireNonNull(string)di dalamnya karena jika seseorang memanggil stripQuotes (null) mereka mungkin melakukannya karena kesalahan!
brcolow
2
Diedit: Baru saja menyadari bahwa saya harus menentukan bahwa ini hanya berfungsi jika keduanya ada. Jika tidak, string tidak dianggap dikutip. Skenario seperti itu muncul pada saya saat bekerja dengan file CSV.
Pertanyaan ini sudah berisi banyak jawaban dan jawaban yang diterima. Bisakah Anda menjelaskan (dengan mengedit jawaban Anda) di mana jawaban Anda berbeda dari jawaban lainnya? Ketahuilah juga bahwa jawaban khusus kode tidak berguna dalam jangka panjang.
Saya memberikan suara untuk menghapus jawaban ini, karena ini adalah reproduksi dari komponen penting stackoverflow.com/a/25452078/1839439 . Selain itu, ada jawaban lain yang dihapus untuk memposting ulang jawaban ini. Sesuai Flag Duplicate Answers on the same Question , tidak ada nilai tambah bagi SO untuk menyimpan dua jawaban dengan solusi yang sama. Dari Review .
Jawaban:
Anda bisa menggunakan
String#replaceAll()
dengan pola^\"|\"$
untuk ini.Misalnya
string = string.replaceAll("^\"|\"$", "");
Untuk mempelajari lebih lanjut tentang ekspresi reguler, dapatkan al ook di http://regular-expression.info .
Meskipun demikian, baunya seperti Anda mencoba menciptakan parser CSV. Jika demikian, saya sarankan untuk melihat-lihat perpustakaan yang ada, seperti OpenCSV .
sumber
String#indexOf()
,String#substring()
, metode dan sebagainya. Ini hanya sedikit lebih cepat, tetapi lebih banyak kode. @GK: Eh, apakah Anda membaca / memahami regex atau bahkan mengujinya?^\"|\"$
.|
berarti "atau". Dengan demikian akan cocok dengan salah satu^\"
atau\"$
.^
cocok dengan awal string dan$
cocok dengan akhir string.^\"
Berarti cocok dengan kutipan di awal string dan\"$
cocok dengan kutipan di akhir string.Untuk menghapus karakter pertama dan karakter terakhir dari string, gunakan:
myString = myString.substring(1, myString.length()-1);
sumber
Juga dengan 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"
Begitu,
final String SchrodingersQuotedString = "may or may not be quoted"; StringUtils.strip(SchrodingersQuotedString, "\""); //quoted no more
Metode ini berfungsi baik dengan string yang dikutip dan tidak dikutip seperti yang ditunjukkan dalam contoh saya. Satu-satunya downside adalah, itu tidak akan mencari kutipan yang benar-benar cocok , hanya karakter kutipan di depan dan di belakang (yaitu, tidak ada perbedaan antara
"partially
dan"fully"
kutipan string).sumber
Ini adalah cara terbaik yang saya temukan, untuk menghapus tanda kutip ganda dari awal dan akhir string.
someString.replace (/(^")|("$)/g, '')
sumber
Jika tanda kutip ganda hanya ada di awal dan di akhir, kode sederhana seperti ini akan bekerja dengan sempurna:
string = string.replace("\"", "");
sumber
Dengan jambu biji, Anda bisa menulis dengan lebih elegan
CharMatcher.is('\"').trimFrom(mystring);
sumber
Pertama, kami memeriksa untuk melihat apakah String dikutip dua kali lipat, dan jika demikian, hapus mereka. Anda dapat melewati persyaratan jika sebenarnya Anda tahu itu dikutip ganda.
if (string.length() >= 2 && string.charAt(0) == '"' && string.charAt(string.length() - 1) == '"') { string = string.substring(1, string.length() - 1); }
sumber
Kotlin
Di Kotlin Anda dapat menggunakan String.removeSurrounding (pembatas: CharSequence)
Misalnya
string.removeSurrounding("\"")
Kode sumbernya terlihat seperti ini:
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 }
sumber
removeSurrounding()
metode yang saya bagikan di atas menurut saya dapat dengan mudah dimengerti oleh pengembang java mana pun.Pola di bawah ini, saat digunakan dengan
java.util.regex.Matcher
, akan cocok dengan string apa pun di antara tanda kutip ganda tanpa memengaruhi kemunculan tanda kutip ganda di dalam string:"[^\"][\\p{Print}]*[^\"]"
sumber
Untuk menghapus satu atau lebih tanda kutip ganda dari awal dan akhir string di Java, Anda perlu menggunakan solusi berbasis regex:
String result = input_str.replaceAll("^\"+|\"+$", "");
Jika Anda juga perlu menghapus tanda kutip tunggal:
String result = input_str.replaceAll("^[\"']+|[\"']+$", "");
CATATAN : Jika string Anda berisi
"
di dalam, pendekatan ini dapat menyebabkan masalah (misalnya"Name": "John"
=>Name": "John
).Lihat demo Java di sini :
String input_str = "\"'some string'\""; String result = input_str.replaceAll("^[\"']+|[\"']+$", ""); System.out.println(result); // => some string
sumber
Mengubah sedikit jawaban @ brcolow
if (string != null && string.length() >= 2 && string.startsWith("\"") && string.endsWith("\"") { string = string.substring(1, string.length() - 1); }
sumber
@NonNull
dan mungkin harus memiliki sesuatu sepertiObjects.requireNonNull(string)
di dalamnya karena jika seseorang memanggil stripQuotes (null) mereka mungkin melakukannya karena kesalahan!Diedit: Baru saja menyadari bahwa saya harus menentukan bahwa ini hanya berfungsi jika keduanya ada. Jika tidak, string tidak dianggap dikutip. Skenario seperti itu muncul pada saya saat bekerja dengan 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\""
sumber
Matcher m = Pattern.compile("^\"(.*)\"$").matcher(value); String strUnquoted = value; if (m.find()) { strUnquoted = m.group(1); }
sumber
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; }
sumber
Scala
s.stripPrefix("\"").stripSuffix("\"")
Ini berfungsi terlepas dari apakah string memiliki atau tidak memiliki tanda kutip di awal dan / atau akhir.
Edit: Maaf, hanya Scala
sumber
Saya menggunakan sesuatu yang sederhana seperti ini:
if(str.startsWith("\"") && str.endsWith("\"")) { str = str.substring(1, str.length()-1); }
sumber
temukan indeks dari setiap tanda kutip ganda dan masukkan string kosong di sana.
sumber
public String removeDoubleQuotes(String request) { return request.replace("\"", ""); }
sumber