Bagaimana cara memangkas awal dan akhir tanda kutip ganda dari sebuah string?

143

Saya ingin memangkas awal dan akhir kutipan ganda (") dari sebuah string.
Bagaimana saya bisa mencapainya di Jawa? Terima kasih!

ufk
sumber
1
Apakah string sudah diketahui memiliki tanda kutip di sekitarnya, atau apakah memeriksa tanda kutip bagian dari masalah?
Michael Myers

Jawaban:

257

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 .

BalusC
sumber
6
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:

myString = myString.substring(1, myString.length()-1);
Michael Myers
sumber
18
Ini hanya mensyaratkan bahwa kutipan harus dijamin ada. Jika tidak ada jaminan, maka Anda harus memeriksanya terlebih dahulu.
BalusC
4
@BalusC: Tentu. Dari pembacaan saya atas pertanyaan tersebut, tampaknya string tersebut sudah diketahui memiliki tanda kutip di sekitarnya.
Michael Myers
.length adalah properti bukan fungsi
Martin
4
@Martin: .length adalah properti array, tetapi .length () adalah metode Strings.
Michael Myers
@MichaelMyers: Ups, maaf saya dalam mode mental JavaScript. Kesalahanku.
Martin
18

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 "partiallydan "fully"kutipan string).

rath
sumber
14

Ini adalah cara terbaik yang saya temukan, untuk menghapus tanda kutip ganda dari awal dan akhir string.

someString.replace (/(^")|("$)/g, '')
Yaniv Levi
sumber
2
Mungkin menyertakan tanda kutip tunggal untuk mengganti (/ (^ \ "| \ ') | (\" | \' $) / g, "");
bob
13

Jika tanda kutip ganda hanya ada di awal dan di akhir, kode sederhana seperti ini akan bekerja dengan sempurna:

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

sunraincyq
sumber
12

Dengan jambu biji, Anda bisa menulis dengan lebih elegan CharMatcher.is('\"').trimFrom(mystring);

legrass
sumber
2
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.

if (string.length() >= 2 && string.charAt(0) == '"' && string.charAt(string.length() - 1) == '"')
{
    string = string.substring(1, string.length() - 1);
}
brcolow.dll
sumber
Ini adalah jawaban yang paling berkinerja berdasarkan urutan besarnya dan bahkan menentukan apa yang harus dilakukan berkenaan dengan opsional atau tidak adanya tanda kutip.
entonio
7

Kotlin

Di Kotlin Anda dapat menggunakan String.removeSurrounding (pembatas: CharSequence)

Misalnya

string.removeSurrounding("\"")

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)
    }
    return this
}
Ryan Amaral
sumber
1
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:

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

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
Wiktor Stribiżew
sumber
2

Mengubah sedikit jawaban @ brcolow

if (string != null && string.length() >= 2 && string.startsWith("\"") && string.endsWith("\"") {
    string = string.substring(1, string.length() - 1);
}
Bingung
sumber
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.

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

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

Brendan Maguire
sumber
1

Saya menggunakan sesuatu yang sederhana seperti ini:

if(str.startsWith("\"") && str.endsWith("\""))
        {
            str = str.substring(1, str.length()-1);
        }
utkarsh
sumber
0

temukan indeks dari setiap tanda kutip ganda dan masukkan string kosong di sana.

GuruKulki
sumber
jadi itu harus indeks pertama dan indeks terakhir dari qoute ganda.
GuruKulki
0
public String removeDoubleQuotes(String request) {
    return request.replace("\"", "");
}
Gurunath Kulkarni
sumber
3
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.
7uc1f3r
3
Ini sudah disarankan dalam jawaban ini stackoverflow.com/a/25452078/1839439 tolong jangan tambahkan yang lain.
Dharman
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 .
Trenton McKinney