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 quotes
olarak çı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 substr
için kesilmiş olanlar ilk ve son karakter. Dizeler sıfır indekslidir, bu nedenle son karakter charAt(str.length -1)
. substr
birincisi 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