Bir dize çift tırnak kaldırmak istiyorum


239

""Bir dize kaldırmak istiyorum .

Örneğin String ise: "I am here"o zaman sadece çıktı almak istiyorum I am here.


4
Neden string.replace ('"', '') kullanmıyorsunuz
Adarsh ​​Kumar

69
str = str.replace(/"/g,"");
Mr_Green

11
TÜM tırnak işaretlerini veya sınır tırnak işaretlerini kaldırmak istiyor musunuz?
Kos

36
stackoverflow.com/q/19155566/989121 . Her ASCII karakteri için 255 soru soracak mısınız?
georg

6
str = str.replace(/^"|"$/g, '');sınır tırnaklarını değiştirir. Mr_Green'in cevabı küresel "olan TÜM'ün yerini alacak , ki bu iyi değil
Kolob Kanyonu

Yanıtlar:


387

varsayarsak:

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

Bu hile yapmalı ... (hedefiniz tüm çift ​​tırnakların yerini almaksa).

Şöyle çalışır:

  • ['"]bir karakter sınıfıdır, hem tek hem de çift tırnaklarla eşleşir. bunu "yalnızca çift tırnaklarla eşleştirmek için değiştirebilirsiniz .
  • +: önceki karakter sınıfı tarafından tanımlanan bir veya daha fazla tırnak, karakter (isteğe bağlı)
  • g: küresel bayrak. Bu, JS'ye normal dizeyi tüm dizeye uygulamasını söyler. Bunu atlarsanız, yalnızca tek bir karakterin yerini alırsınız.

Belirli bir dize (yani çiftler) içindeki tırnak işaretlerini kaldırmaya çalışıyorsanız, işler biraz daha zorlaşır. Etrafa ilişkin iddialar kullanmanız gerekecek:

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 açıkladı:

  • ": değişmez, herhangi bir değişmezle eşleşir "
  • (: grup yakalamaya başlayın. Parantezler ( ()) arasındaki her şey yakalanır ve değiştirme değerinde kullanılabilir.
  • [^"]+: Karakter sınıfı, 1 veya daha fazla kez hariç tüm karakterlerle eşleşir"
  • (?="): sıfır genişlikli (yakalanmayanlarda olduğu gibi) pozitif ileri okuma iddiası. Önceki maç sadece bir "değişmezi takip ediyorsa geçerlidir
  • ): son yakalama grubu, açılış kapanışı arasındaki her şeyi yakaladık "
  • ": başka bir değişmez, cf liste öğesi bir

Yerine koyma '$1', bu, [^" ]+çift ​​tırnaklar arasında olan veya her biri arasındaki ilk yakalanan gruba geri başvuru niteliğindedir . Desen, hem tırnak işaretleri hem de bunların arasında bulunanlarla eşleşir, ancak yalnızca tırnak işaretleri arasında kalanlarla değiştirir ve böylece bunları etkili bir şekilde kaldırır.
Öyle neyi some "string with" quotes-> cümledeki "string with"ile -> string with. Alıntılar gitti, iş bitti.

Tırnak işaretleri her zaman dizenin başında ve sonunda olacaksa, bunu kullanabilirsiniz:

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

Giriş ile remove "foo" delimiting "çıkış değişmeden kalır, ancak giriş dizesini olarak değiştirir "remove "foo" delimiting quotes"ve sonuç remove "foo" delimiting quotesolarak çıktı olarak elde edersiniz .

Açıklama:

  • ^": dizenin başıyla ^ve a ile eşleşir ". Dize a ile başlamazsa ", ifade zaten burada başarısız olur ve hiçbir şey değiştirilmez.
  • (.+(?="$)): Pozitif yönün doğru olması koşuluyla, çift tırnak işaretleri dahil olmak üzere her şeyi bir veya daha fazla kez eşleştirir (ve yakalar)
  • (?="$): pozitif ileriye alma yukarıdakiyle aynıdır, yalnızca dizenin sonu " olması gerektiğini belirtir ( $=== bitiş)
  • "$: biten alıntıyla eşleşir, ancak yakalanmaz

Değiştirme, önceki ile aynı şekilde yapılır: eşleşmeyi (açılış ve kapanış kotalarını içeren), içindeki her şeyle değiştiririz. Bayrağı (genel BTW için)
atladığımı fark etmiş olabilirsiniz g, çünkü dizenin tamamını işlediğimizden bu ifade yalnızca bir kez uygulanır.
Hemen hemen aynı şeyi yapan daha kolay bir normal ifade (normal ifadenin nasıl derlendiği / uygulandığı konusunda içsel bir fark vardır):

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

Daha önce olduğu gibi ^"ve "$bir dizenin başında ve sonunda sınırlayıcı tırnak işaretlerini eşleştirin ve (.+)aradaki her şeyi eşleştirir ve yakalar. Ben bu regex denedim, (biri ileriye doğru iddiası ile) tarafı boyunca ve itiraf, benim surprize için bu biraz daha yavaş bulundu. Benim tahminim, motorun "dizenin sonunda hiçbir şey olmadığını belirlediğinde, arama ifadesi önceki ifadenin başarısız olmasına neden olur . Ah iyi, ama eğer istediğin / ihtiyacın buysa, lütfen okumaya devam et :

Bununla birlikte, bu son durumda, çok daha güvenli, daha hızlı, daha sürdürülebilir ve bunu yapmak daha iyidir:

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

Burada, dizedeki ilk ve son karakter çift tırnak olup olmadığını kontrol ediyorum. Böyle bir durumda, ben kullanıyorum substriçin kesilmiş olanlar ilk ve son karakter. Dizeler sıfır indekslidir, bu nedenle son karakter charAt(str.length -1). substrbirincisi alt dizenin başladığı uzaklık, ikincisi uzunluğudur. Son karakteri istemediğimizden, artık ilkini istediğimizden daha fazla, bu uzunluk str.length - 2. Kolay peazy.

İpuçları :

Yeniden inceleme iddiaları hakkında daha fazla bilgiyi burada bulabilirsiniz Regex'ler
çok faydalıdır (ve IMO eğlencesi), ilk başta biraz şaşırtıcı olabilir. İşte bazı ayrıntılar ve konuyla ilgili kaynaklara bağlantılar .
Henüz regex kullanmaktan çok rahat değilseniz, aşağıdakileri kullanmayı düşünebilirsiniz:

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

Dizede çok fazla alıntı varsa, bu normal ifade kullanmaktan daha hızlı olabilir


1
@rid: Düzenledim, ifadenin ne yaptığına ve nasıl özelleştirileceğine dair biraz açıklama yaptım
Elias Van Ootegem

83
str = str.replace(/^"(.*)"$/, '$1');

Bu normal ifade tırnak işaretlerini yalnızca dizenin ilk ve son karakterleri ise kaldırır. f.ex:

"I am here"  => I am here (replaced)
I "am" here  => I "am" here (untouched)
I am here"   => I am here" (untouched)

63

Dizenin başında ve sonunda bir alıntı (veya başka bir tek karakter) olması garanti edilirse, kaldırmak istediğiniz:

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

slice normal bir ifadeden çok daha az ek yüke sahiptir.


8
Neden inişler? '' Ben buradayım ''. Dilim (1, -1) -> 'Ben buradayım'!
Darrinm

2
Bu, RDF değişmezleriyle uğraşıyorsanız tam olarak ihtiyacınız olan 'hızlı' işlem türünden dolayı şaşırmıştır (örneğin N3'te, URI'ler genellikle benzer <uri>ve değişmez değerler olarak belirtilir "literal"). İşte size bir oylama. ;)
Mark Birbeck

2
(Özellikle orijinal soru, bir dize çevresindeki tırnak işaretlerini kaldırmak istediklerini söylediğinden .)
Mark Birbeck

2
Bu, tam olarak sorulan şeyi yaptığı ve etkili bir şekilde yaptığı gibi kabul edilen cevap olmalıdır.
Pascal

38

Verileriniz üzerinde kontrolünüz varsa ve çift tırnaklarınızın dizeyi çevrelediğini biliyorsanız (dize içinde görünmez) ve dize bir tamsayıdır ...

"20151212211647278"

ya da benzeri, çevresindeki alıntıları güzel bir şekilde kaldırır

JSON.parse("20151212211647278");

Evrensel bir cevap değil, niş ihtiyaçlar için kaygan


Bu FireFox ile şu hatayla hata verecektir: SyntaxError: JSON.parse: JSON verisinin 1. satır sütununda beklenmedik karakter
Ben Pretorius

no ...
FireFox'un

JSON.parse ( "{123123}"); bu cevabını uçuracak
Abhijeet

3
JSON.parse("20151212211647278dfvs"); SyntaxError: Unexpected token d in JSON at position 17
Sistem Yeniden Başlatıcı

1
bir hata aldım SyntaxError: 0 konumunda
JSON'da

17

Yalnızca sınır tırnak işaretlerini kaldırmak istiyorsanız:

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

Bu yaklaşım, görünmüyorsa dizeye dokunmaz "text in quotes".


2
Kullanım a.charAt(x)sen <(IE7 f.ex) ECMA5 desteğini istiyorum.
David Hellsing

8

Tırnakları yalnızca başından veya sonundan kaldırmak istiyorsanız, aşağıdaki normal ifadeyi kullanın:

'"Hello"'.replace(/(^"|"$)/g, '');

1
Bunun da değişeceğini "foove foo". Bunların sadece çiftlerini bırakmak isteyebilirsiniz.
Kos

Not için teşekkürler, bunun beklenen bir davranış olduğunu düşündüm.
Denis

5

Sorununuzu normal bir ifade olarak daha kolay ifade edilecek şekilde yeniden ifade etmek için:

Sıfır veya bir önde gelen çift tırnak ve sıfır veya bir sondaki çift tırnak arasında bulunan karakterlerin alt dizesini alın.

İşte bunu yapan normal ifade:

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

Normal ifadeyi yıkmak:

  • ^"? sıfır veya önde gelen çift tırnak için açgözlü bir eşleşme
  • "?$ sıfır veya bir çift çift tırnak için açgözlü bir eşleşme
  • bu ikisi (.+?), hedefi içerecek olan diğer tüm karakterlerin açgözlü olmayan bir yakalamasını yapar $1.

Bu, aşağıdakiler için geri döner delimited "string" here:

str = "delimited "string" here"  // ...
str = '"delimited "string" here"' // ...
str = 'delimited "string" here"' // ... and
str = '"delimited "string" here'

5

Tembel insanlar için tek bir astar

var str = '"a string"';
str = str.replace(/^"|"$/g, '');

Bu en uygun cevap. /"/gişe yaramaz "My name is \"Jason\"".
Jason Liu

Bu cevap , başlangıç ​​ve sondaki her alıntıyı kaldırır , bu da " - is a quotedize olması durumunda iyi değildir , bu yüzden etrafındaki ile
vladkras

2

Bu çalışıyor...

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));


kod yanlış. Boş dize girişini deneyin 'foo"veya basitçe deneyinfoo"
Pavel P

1
var expressionWithoutQuotes = '';
for(var i =0; i<length;i++){
    if(expressionDiv.charAt(i) != '"'){
        expressionWithoutQuotes += expressionDiv.charAt(i);
    }
}

Bu sizin için işe yarayabilir.


0

Dizedeki tüm çift tırnak işaretlerini kaldırmak istiyorsanız şunu kullanın:

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

Aksi takdirde, yalnızca dizenin çevresindeki tırnak işaretlerini kaldırmak istiyorsanız şunu kullanın:

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

0

Bu basit kod, örneğin çift tırnak ile çevrili bir dizeden çift tırnak kaldırmak için de çalışır:

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

0

Çift tırnak işaretlerini kaldırmaya çalışıyorsanız aşağıdakileri deneyin

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

0

bu kod metin kutusundaki numarayı göstermek için çok daha iyi

$ (this) = [metin kutunuz]

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

-2

Dizeden çift tırnak işareti kaldırmak için lütfen normal ifadeyi izlemeyi deneyin.

    $string = "I am here";
    $string =~ tr/"//d;
    print $string;
    exit();

2
Javascript çözümü istiyorlar!
Toto
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.