Saya ingin menghapus tanda kutip ganda dari sebuah String

239

Saya ingin menghapus ""sekitar String.

misal jika Stringnya adalah: "I am here"maka saya ingin output saja I am here.

ankur
sumber
4
Mengapa Anda tidak menggunakan string.replace ('"', '')
Adarsh ​​Kumar
69
str = str.replace(/"/g,"");
Mr_Green
11
Apakah Anda ingin menghapus SEMUA tanda kutip atau tanda batas?
Kos
36
stackoverflow.com/q/19155566/989121 . Apakah Anda akan mengajukan 255 pertanyaan, satu kali untuk setiap karakter ASCII?
georg
6
str = str.replace(/^"|"$/g, '');menggantikan tanda kutip batas. Jawaban Mr_Green secara global akan menggantikan SEMUA "yang tidak baik
Kolob Canyon

Jawaban:

387

Asumsi:

var someStr = 'He said "Hello, my name is Foo"';
console.log(someStr.replace(/['"]+/g, ''));

Itu harus melakukan trik ... (jika tujuan Anda adalah mengganti semua tanda kutip ganda).

Begini cara kerjanya:

  • ['"]adalah kelas karakter, cocok dengan tanda kutip tunggal dan ganda. Anda dapat menggantinya dengan "hanya mencocokkan tanda kutip ganda.
  • +: satu atau lebih tanda kutip, karakter, seperti yang didefinisikan oleh char-class sebelumnya (opsional)
  • g: bendera global . Ini memberitahu JS untuk menerapkan regex ke seluruh string. Jika Anda menghilangkan ini, Anda hanya akan mengganti satu karakter.

Jika Anda mencoba untuk menghapus tanda kutip di sekitar string yang diberikan (yaitu berpasangan), semuanya menjadi sedikit lebih rumit. Anda harus menggunakan pernyataan lookaround:

var str = 'remove "foo" delimiting double quotes';
console.log(str.replace(/"([^"]+(?="))"/g, '$1'));
//logs remove foo delimiting quotes
str = 'remove only "foo" delimiting "';//note trailing " at the end
console.log(str.replace(/"([^"]+(?="))"/g, '$1'));
//logs remove only foo delimiting "<-- trailing double quote is not removed

Regex menjelaskan:

  • ": literal, cocok dengan literal apa pun "
  • (: mulai menangkap grup. Apa pun yang berada di antara tanda kurung ( ()) akan ditangkap, dan dapat digunakan dalam nilai penggantian.
  • [^"]+: Kelas karakter, cocok semua karakter, kecuali "1 kali atau lebih
  • (?="): nol-lebar (seperti yang tidak ditangkap) pernyataan lookahead positif. Pertandingan sebelumnya hanya akan valid jika diikuti oleh "literal
  • ): end capturing group, kami telah menangkap semuanya di antara penutupan pembukaan "
  • ": satu lagi literal, daftar item cf

Penggantinya adalah '$1', ini adalah referensi-kembali ke kelompok yang ditangkap pertama, sedang [^" ]+, atau setiap di antara tanda kutip ganda. Pola tersebut cocok dengan tanda kutip dan apa yang ada di antara mereka, tetapi menggantinya hanya dengan apa yang ada di antara tanda kutip, sehingga secara efektif menghapusnya.
Apa yang dilakukannya adalah some "string with" quotes-> diganti "string with"dengan ->string with . Kutipan hilang, pekerjaan selesai.

Jika kutipan selalu berada di awal dan akhir string, maka Anda bisa menggunakan ini:

str.replace(/^"(.+(?="$))"$/, '$1');

Dengan input remove "foo" delimiting ", output akan tetap tidak berubah, tetapi ubah string input menjadi "remove "foo" delimiting quotes", dan Anda akan berakhir denganremove "foo" delimiting quotes sebagai output.

Penjelasan:

  • ^": cocok dengan awal string ^dan a ". Jika string tidak dimulai dengan a ", ekspresi sudah gagal di sini, dan tidak ada yang diganti.
  • (.+(?="$)): cocok (dan menangkap) semuanya, termasuk tanda kutip ganda satu kali atau lebih, asalkan lookahead positif itu benar
  • (?="$): lookahead positif sama seperti di atas, hanya itu menentukan bahwa " harus menjadi akhir dari string ($ === end)
  • "$: cocok dengan kutipan yang berakhir, tetapi tidak menangkapnya

Penggantian dilakukan dengan cara yang sama seperti sebelumnya: kami mengganti pertandingan (yang termasuk kutipan pembukaan dan penutupan), dengan semua yang ada di dalamnya.
Anda mungkin memperhatikan bahwa saya telah menghilangkan gflag (untuk BTW global), karena sejak kami memproses seluruh string, ungkapan ini hanya berlaku sekali.
Regex yang lebih mudah, cukup banyak, hal yang sama (ada perbedaan internal tentang bagaimana regex dikompilasi / diterapkan) adalah:

someStr.replace(/^"(.+)"$/,'$1');

Seperti sebelumnya ^"dan "$cocok dengan tanda kutip pembatas di awal dan akhir string, dan cocokkan (.+)semuanya di antara, dan menangkapnya. Saya sudah mencoba regex ini, di samping yang di atas (dengan pernyataan lookahead) dan, harus diakui, saya terkejut menemukan ini sedikit lebih lambat. Dugaan saya adalah bahwa pernyataan lookaround menyebabkan ekspresi sebelumnya gagal segera setelah mesin menentukan tidak ada "pada akhir string. Ah well, tetapi jika ini yang Anda inginkan / butuhkan, harap baca terus :

Namun, dalam kasus terakhir ini, ini jauh lebih aman, lebih cepat, lebih dapat dipelihara dan lebih baik untuk melakukan ini:

if (str.charAt(0) === '"' && str.charAt(str.length -1) === '"')
{
    console.log(str.substr(1,str.length -2));
}

Di sini, saya memeriksa apakah karakter pertama dan terakhir dalam string adalah tanda kutip ganda. Jika ya, saya gunakan substruntuk memotong karakter pertama dan terakhir. String diindeks nol, jadi karakter terakhir adalah charAt(str.length -1). substrmengharapkan 2 argumen, di mana yang pertama adalah offset tempat substring dimulai, yang kedua adalah panjangnya. Karena kita tidak menginginkan char terakhir, lebih dari yang kita inginkan dulu, panjangnya adalah str.length - 2. Mudah sekali.

Kiat :

Lebih lanjut tentang pernyataan lookaround dapat ditemukan di sini
Regex sangat berguna (dan IMO menyenangkan), dapat sedikit membingungkan pada awalnya. Berikut beberapa detail lainnya, dan tautan ke sumber daya tentang masalah ini.
Jika Anda belum terlalu nyaman menggunakan regex, Anda mungkin ingin mempertimbangkan untuk menggunakan:

var noQuotes = someStr.split('"').join('');

Jika ada banyak kutipan dalam string, ini bahkan mungkin lebih cepat daripada menggunakan regex

Elias Van Ootegem
sumber
1
@rid: Saya mengedit, menjelaskan sedikit tentang apa yang dilakukan ekspresi, dan bagaimana menyesuaikannya
Elias Van Ootegem
83
str = str.replace(/^"(.*)"$/, '$1');

Regexp ini hanya akan menghapus tanda kutip jika mereka adalah karakter pertama dan terakhir dari string. F.ex:

"I am here"  => I am here (replaced)
I "am" here  => I "am" here (untouched)
I am here"   => I am here" (untouched)
David Hellsing
sumber
63

Jika string dijamin memiliki satu kutipan (atau karakter tunggal lainnya) di awal dan akhir yang ingin Anda hapus:

str = str.slice(1, -1);

slice memiliki overhead jauh lebih sedikit daripada ekspresi reguler.

darrinm
sumber
8
Mengapa downvotes? '"Saya di sini"'. Slice (1, -1) -> 'Saya di sini'!
darrinm
2
Terkejut ini telah diturunkan karena itu persis seperti operasi 'cepat' yang Anda butuhkan jika Anda berurusan dengan RDF literals (dalam N3, misalnya, URI biasanya dilambangkan seperti <uri>dan literal suka "literal"). Jadi inilah upvote. ;)
Mark Birbeck
2
(Terutama karena pertanyaan awal mengatakan mereka ingin menghapus tanda kutip di sekitar string.)
Mark Birbeck
2
Ini harus menjadi jawaban yang diterima karena ia melakukan persis apa yang diminta, dan melakukannya dengan efisien.
Pascal
38

Jika Anda memiliki kontrol atas data Anda dan Anda tahu tanda kutip ganda mengelilingi string (jadi jangan muncul di dalam string) dan string adalah bilangan bulat ... katakan dengan:

"20151212211647278"

atau serupa ini dengan baik menghilangkan tanda kutip sekitarnya

JSON.parse("20151212211647278");

Namun bukan jawaban universal yang apik untuk kebutuhan niche

Scott Stensland
sumber
Ini akan kesalahan pada FireFox dengan: SyntaxError: JSON.parse: karakter tak terduga di baris 1 kolom 1 dari data JSON
Ben Pretorius
tidak ... berfungsi dengan baik pada rilis FireFox terbaru
Scott Stensland
JSON.parse ("{123123}"); ini akan menghilangkan jawaban Anda
Abhijeet
3
JSON.parse("20151212211647278dfvs"); SyntaxError: Unexpected token d in JSON at position 17
Sistem Rebooter
1
saya mendapat kesalahan SyntaxError: Token yang tidak terduga <di JSON di posisi 0
Freddy Sidauruk
17

Jika Anda hanya ingin menghapus kutipan batas:

function stripquotes(a) {
    if (a.charAt(0) === '"' && a.charAt(a.length-1) === '"') {
        return a.substr(1, a.length-2);
    }
    return a;
}

Pendekatan ini tidak akan menyentuh string jika tidak terlihat "text in quotes".

Kos
sumber
2
Gunakan a.charAt(x)jika Anda menginginkan <ECMA5 support (f.ex IE7).
David Hellsing
8

Jika Anda hanya ingin menghapus tanda kutip dari awal atau akhir, gunakan persamaan reguler berikut:

'"Hello"'.replace(/(^"|"$)/g, '');
Denis
sumber
1
Perhatikan ini juga akan mengubah "foodan foo". Seseorang mungkin hanya ingin menjatuhkan seluruh pasangan ini.
Kos
Terima kasih atas catatannya, saya pikir itu adalah perilaku yang diharapkan.
Denis
5

Untuk menyatakan kembali masalah Anda dengan cara yang lebih mudah untuk diungkapkan sebagai ekspresi reguler:

Dapatkan substring karakter yang terkandung antara nol atau satu tanda kutip ganda dan nol atau satu tanda kutip ganda.

Inilah regexp yang melakukan itu:

  var regexp = /^"?(.+?)"?$/;
  var newStr = str.replace(/^"?(.+?)"?$/,'$1');

Merinci regexp:

  • ^"? pertandingan serakah untuk nol atau satu tanda kutip ganda terkemuka
  • "?$ pertandingan serakah untuk nol atau satu tanda kutip ganda
  • dua bookend itu menangkap semua karakter lain yang tidak serakah (.+?), yang akan mengandung target sebagai $1.

Ini akan kembali delimited "string" hereuntuk:

str = "delimited "string" here"  // ...
str = '"delimited "string" here"' // ...
str = 'delimited "string" here"' // ... and
str = '"delimited "string" here'
Mogsdad
sumber
5

Satu liner untuk orang-orang malas

var str = '"a string"';
str = str.replace(/^"|"$/g, '');
Ngarai Kolob
sumber
Ini jawaban yang paling tepat. /"/gtidak akan bekerja untuk "My name is \"Jason\"".
Jason Liu
jawaban ini menghilangkan setiap kutipan di awal dan di akhir, yang tidak baik dalam hal " - is a quotestring, jadi tidak sama dengan di sekitar
vladkras
2

Ini bekerja...

var string1 = "'foo'";
var string2 = '"bar"';

function removeFirstAndLastQuotes(str){
  var firstChar = str.charAt(0);
  var lastChar = str[str.length -1];
  //double quotes
  if(firstChar && lastChar === String.fromCharCode(34)){
    str = str.slice(1, -1);
  }
  //single quotes
  if(firstChar && lastChar === String.fromCharCode(39)){
    str = str.slice(1, -1);
  }
  return str;
}
console.log(removeFirstAndLastQuotes(string1));
console.log(removeFirstAndLastQuotes(string2));

Ronnie Royston
sumber
kode salah. Coba masukan string kosong, atau coba 'foo"atau cukupfoo"
Pavel P
1
var expressionWithoutQuotes = '';
for(var i =0; i<length;i++){
    if(expressionDiv.charAt(i) != '"'){
        expressionWithoutQuotes += expressionDiv.charAt(i);
    }
}

Ini mungkin bekerja untuk Anda.

Splinker P
sumber
0

Jika Anda ingin menghapus semua tanda kutip ganda dalam string, gunakan

var str = '"some "quoted" string"';
console.log( str.replace(/"/g, '') );
// some quoted string

Kalau tidak, Anda hanya ingin menghapus tanda kutip di sekitar string, gunakan:

var str = '"some "quoted" string"';
console.log( clean = str.replace(/^"|"$/g, '') );
// some "quoted" string
balkon_smoke
sumber
0

Kode sederhana ini juga akan berfungsi, untuk menghapus misalnya kutipan ganda dari string yang dikelilingi dengan kutipan ganda:

var str = 'remove "foo" delimiting double quotes';
console.log(str.replace(/"(.+)"/g, '$1'));
Amaynut
sumber
0

Jika Anda mencoba menghapus tanda kutip ganda coba ikuti

  var Stringstr = "\"I am here\"";
  var mystring = String(Stringstr);
  mystring = mystring.substring(1, mystring.length - 1);
  alert(mystring);
krunal shimpi
sumber
0

kode ini sangat baik untuk menunjukkan nomor dalam kotak teks

$ (ini) = [kotak teks Anda]

            var number = $(this).val();
            number = number.replace(/[',]+/g, '');
            number = number.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',');
            $(this).val(number); // "1,234,567,890"
ali alizadeh
sumber
-2

Silakan coba ikuti regex untuk menghapus tanda kutip ganda dari string.

    $string = "I am here";
    $string =~ tr/"//d;
    print $string;
    exit();
krunal shimpi
sumber
2
Mereka menginginkan solusi javascript!
Toto