JavaScript düzenli ifadeleri. karakter seti arıyorum

bu Normalİfade yapıcı, metni bir kalıpla eşleştirmek için normal bir ifade nesnesi oluşturur.

Normal ifadelere giriş için JavaScript Kılavuzundaki Normal İfadeler bölümünü okuyun.

Bu etkileşimli örneğin kaynağı bir GitHub deposunda depolanır. Etkileşimli örnekler projesine katkıda bulunmak istiyorsanız, lütfen https://github.com/mdn/interactive-examples klonlayın ve bize bir çekme isteği gönderin.

Sözdizimi

Değişmez, yapıcı ve fabrika gösterimleri mümkündür:

/ kalıp / bayraklar yeni RegExp(kalıp [, bayraklar ]) RegExp( kalıp [, bayraklar ])

parametreler

desen Normal ifadenin metni; veya ES5'ten itibaren, başka bir RegExp nesnesi veya değişmezi (yalnızca iki RegExp kurucu gösterimi için). Kalıplar, gerçek bir dizeden daha geniş bir değer aralığıyla eşleşebilmeleri için içerebilir. bayraklar

Belirtilirse, bayraklar eklenecek bayrakları içeren bir dizedir; veya kalıp için bir nesne sağlanırsa, bayraklar dizesi o nesnenin bayraklarından herhangi birinin yerini alır (ve lastIndex 0'a sıfırlanır (ES2015'ten itibaren). Bayraklar belirtilmezse ve bir normal ifade nesnesi sağlanırsa, bu nesnenin bayrakları (ve lastIndex değeri) kopyalanacak.

bayraklar aşağıdaki karakterlerin herhangi bir kombinasyonunu içerebilir:

G küresel maç; ilk maçtan sonra durmak yerine tüm eşleşmeleri bul. vakayı görmezden geliyorum; u bayrağı da etkinse, Unicode büyük/küçük harf katlamayı kullanın. m çok satırlı; başlangıç ​​ve bitiş karakterlerini (^ ve $) birden çok satır üzerinde çalışıyormuş gibi ele alın (yani, satırın başlangıcını veya sonunu eşleştirin) her biri satır (\n veya \r ile sınırlandırılmıştır), yalnızca tüm giriş dizesinin en başı veya sonu değil). s"dotAll"; izin verir. yeni satırları eşleştirmek için. u Unicode; deseni bir Unicode kod noktaları dizisi olarak ele alın. (Ayrıca bkz. İkili diziler). yapışkan; yalnızca hedef dizedeki bu normal ifadenin lastIndex özelliği tarafından belirtilen dizinden eşleşir (ve sonraki dizinlerden eşleşmeye çalışmaz).

Açıklama

Bir RegExp nesnesi yaratmanın iki yolu vardır: a gerçek gösterim ve bir kurucu.

  • Gerçek gösterimin parametreler eğik çizgi arasına alınır ve tırnak işareti kullanılmaz.
  • yapıcı işlevi parametreler eğik çizgi arasına alınmaz, ancak tırnak işaretleri kullanılır.

Aşağıdaki ifadeler aynı normal ifadeyi oluşturur:

/ab+c/i yeni RegExp(/ab+c/, "i") // değişmez gösterim yeni RegExp("ab+c", "i") // yapıcı

Değişmez gösterim, ifade değerlendirildiğinde normal ifadenin bir derlemesini sağlar. Normal ifade sabit kalacaksa, değişmez gösterimi kullanın. Örneğin, bir döngüde kullanılan düzenli bir ifade oluşturmak için değişmez gösterim kullanırsanız, normal ifade her yinelemede yeniden derlenmez.

Normal ifade nesnesinin yapıcısı, örneğin, new RegExp("ab+c") , normal ifadenin çalışma zamanı derlemesini sağlar. Normal ifade kalıbının değişeceğini bildiğinizde veya kalıbı bilmiyorsanız ve onu kullanıcı girişi gibi başka bir kaynaktan alıyorsanız yapıcı işlevini kullanın.

ECMAScript 6 ile başlayarak, ilk argüman bir RegExp ve ikinci bayraklar argümanı olduğunda, yeni RegExp(/ab+c/, "i") artık TypeError ("bir RegExp'i diğerinden oluştururken bayrak sağlayamaz") atmıyor mevcut.

Yapıcı işlevini kullanırken, normal dize kaçış kuralları (bir dizeye dahil edildiğinde \ ile özel karakterlerden önce gelen) gereklidir. Örneğin, aşağıdakiler eşdeğerdir:

Let re = /\w+/ let re = new RegExp("\\w+")

Özellikler

RegExp.prototype Tüm nesnelere özelliklerin eklenmesine izin verir. RegExp.length RegExp.length'in değeri 2'dir. get RegExp[@@species] Türetilmiş nesneler oluşturmak için kullanılan yapıcı işlevi. RegExp.lastIndex Sonraki eşleşmenin başlatılacağı dizin.

yöntemler

Global RegExp nesnesinin kendi yöntemi yoktur. Ancak, prototip zinciri aracılığıyla bazı yöntemleri devralır.

RegExp prototip nesneleri ve örnekleri

Özellikler

Örnekler

Veri biçimini değiştirmek için normal bir ifade kullanma

let str = "#foo#" let regex = /foo/y regex.lastIndex = 1 regex.test(str) // true regex.lastIndex = 5 regex.test(str) // false (lastIndex ile dikkate alınır yapışkan bayrak) regex.lastIndex // 0 (eşleşme hatasından sonra sıfırla)

Normal ifade ve Unicode karakterler

Yukarıda belirtildiği gibi, \w veya \W yalnızca ASCII tabanlı karakterlerle eşleşir; örneğin, a'dan z'ye , A'dan Z'ye , 0'dan 9'a ve _ .

Kiril veya İbranice gibi diğer dillerdeki karakterleri eşleştirmek için \u hhhh nerede hhhh karakterin onaltılı olarak Unicode değeridir. Bu örnek, Unicode karakterlerinin bir kelimeden nasıl ayrılabileceğini gösterir.

Let text = "Rusça örnek metin" let regex = /[\u0400-\u04FF]+/g let match = regex.exec(metin) console.log(match) // "Örnek" konsol.log(regex . lastIndex) // "7" günlükleri, let match2 = regex.exec(metin) console.log(match2) // "on" konsol.log(regex.lastIndex) // "15" günlükleri // vb.

URL'den alt alan adını çıkarma

let url = "http://xxx.domain.com" console.log(/[^.]+/.exec(url).substr(7)) // "xxx" günlüğü

Özellikler

Şartname Durum Yorum Yap
ECMAScript 3. Baskı (ECMA-262) standart ilk tanım. JavaScript 1.1'de uygulandı.
ECMAScript 5.1 (ECMA-262)
standart
ECMAScript 2015 (6. Baskı, ECMA-262)
Bu belirtimde "RegExp" tanımı.
standart İlk argüman bir RegExp olduğunda ve ikinci argüman mevcut olduğunda RegExp yapıcısı artık fırlatmaz. Unicode ve yapışkan bayrakları tanıtır.
ECMAScript Son Taslak (ECMA-262)
Bu belirtimde "RegExp" tanımı.
Taslak

Tarayıcı Uyumluluğu

Bu sayfadaki uyumluluk tablosu, yapılandırılmış verilerden oluşturulmuştur. Verilere katkıda bulunmak istiyorsanız, lütfen https://github.com/mdn/browser-compat-data adresini kontrol edin ve bize bir çekme talebi gönderin.

Düzenli ifade oluşturan bir karakter dizisidir arama düzeni.

Bir metinde bir şey bulmanız gerektiğinde, aradığınızı açıklamak için bir arama kalıbı kullanılır.

Normal ifade olarak tek bir karakter veya daha karmaşık bir desen kullanılabilir.

Her türlü işlemi gerçekleştirmek için normal ifadeler kullanılabilir Metin arama ve değiştirmeler.

Sözdizimi:

/desen/değiştiriciler;

Varpatt = /msiter/i;

Örnek açıklama:

  • /msiter/i - Düzenli ifade.
  • bakıcı – arama işleminde kullanılan model.
  • Bence - değiştirici (aramanın büyük/küçük harfe duyarlı olmaması gerektiğini belirtir).

Dize Yöntemlerini Kullanma

JavaScript'te normal ifadeler genellikle iki dize yönteminde kullanılır: Ara() ve yer değiştirmek().

Yöntem Ara() bir eşleşme bulmak için bir ifade kullanır ve bulunan eşleşmenin konumunu döndürür.

Yöntem yer değiştirmek()şablonun değiştirildiği değiştirilmiş dizeyi döndürür.

normal ifade ile search() yöntemi

Aşağıdaki örnek, büyük/küçük harfe duyarsız bir arama için normal bir ifade kullanır:

Var str = "MSiter sitesini ziyaret edin"; var n = str.search(/msiter/i);

Sonuç olarak, bir değişkene n 14 iade edilecektir.

string ile search() yöntemi

Yöntem Ara() parametre olarak bir dize de alabilir. Bu durumda, string parametresi normal bir ifadeye dönüştürülür:

Aşağıdaki örnek, arama yapmak için "MSiter" dizesini kullanır:

Var str = "MSiter sitesini ziyaret edin!"; var n = str.search("MSiter");

normal ifade ile replace() yöntemi

Aşağıdaki örnek, "Microsoft" alt dizesini büyük/küçük harfe duyarlı olmayan bir şekilde "Msiter" ile değiştirmek için normal bir ifade kullanır:

Var str = "Microsoft sitesini ziyaret edin!"; var res = str.replace(/microsoft/i, "MSiter");

Sonuç olarak, res değişkeni "MSiter sitesini ziyaret edin!" dizesini içerecektir.

string ile replace() yöntemi

Yöntem yer değiştirmek() parametre olarak bir dize de alabilir:

Var str = "Microsoft sitesini ziyaret edin!"; var res = str.replace("Microsoft", "MSiter");

fark ettin mi

  • Tanımlanan yöntemlerde parametre olarak normal ifadeler (string yerine) kullanılabilir.
  • Normal ifadeler, arama süreci üzerinde size çok daha fazla kontrol sağlar (örneğin, büyük/küçük harfe duyarlı olmayan bir şekilde arama yapabilirsiniz).

Normal ifade değiştiricileri

değiştiriciler arama alanını genişletmenize izin verir:

Normal ifade kalıpları

Köşeli parantez bir dizi karakter içinde arama yapmak için kullanılır:

meta karakterlerözel anlamı olan karakterlerdir:

niceleyiciler tekrar sayısını belirleyin:

normal ifade nesnesi

V JavaScript nesnesi Normalİfadeönceden tanımlanmış özelliklere ve yöntemlere sahip bir normal ifade nesnesidir.

test metodu

Yöntem Ölçek() RegExp nesnesi, bir kalıp aramak için kullanılır. verilen dize. Sonuca göre true veya false döndürür.

Varpatt = /e/; patt.test("Hayattaki en güzel şeyler bedavadır!");

Bu örnekte dize "e" karakterini içerdiğinden sonuç doğru olacaktır.

Bir RegExp nesnesiyle çalışmak için, düzenli ifadeyi önce bir değişkene yerleştirmek gerekli değildir. Önceki örnekteki iki kod satırı bire indirgenebilir:

/e/.test("Hayattaki en iyi şeyler bedavadır!");

exec() yöntemi

Yöntem yürüt() RegExp nesnesi, verilen dizgide bir kalıp aramak için kullanılır. Bulunan metni döndürür. Hiçbir şey bulunamazsa, null döndürülür.

Aşağıdaki örnek, bir dizgede "e" karakterini arar:

/e/.exec("Hayattaki en iyi şeyler bedavadır!");

Bu örnekte dize "e" karakterini içerdiğinden sonuç e olacaktır.

değiştiriciler

Bir değiştiriciden önce gelen eksi (-) karakteri (U hariç) onun olumsuzluğunu yaratır.

Özel karakterler

analogAçıklama
() alt desen, iç içe ifade
joker karakter
(a,b) "a" ile "b" arasındaki oluşum sayısı
| mantıksal "veya", tek karakterli alternatifler söz konusu olduğunda,
\ özel karakter kaçış
. yeni satır hariç herhangi bir karakter
\D ondalık basamak
\D[^\d]ondalık basamak dışındaki herhangi bir karakter
\F sayfanın sonu (ara)
\n satır çevirisi
\pL u değiştiricisini kullanırken UTF-8 kodlu harf
\r satırbaşı
\s[\t\v\r\n\f]boşluk karakteri
\S[^\s]promel dışında herhangi bir karakter
\T tablolama
\w herhangi bir sayı, harf veya alt çizgi
\W[^\w]sayı, harf veya alt çizgi dışında herhangi bir karakter
\v dikey sekme

Bir karakter sınıfı içindeki özel karakterler

Bir dize içinde konum

ÖrnekUygunlukAçıklama
^ ^ bira aaa aaasatırın başlangıcı
$ bir$aaa aaa a yolun sonu
\A\Aaa aaa aaa
aaa aaa
metnin başlangıcı
\zbir\zaaa aaa
aaa aaa a
metnin sonu
\Ba\b
\ba
aa a aa a
a aa a aa
kelime sınırı, iddia: önceki karakter bir kelimedir, ancak sonraki değildir veya tam tersi
\B\Ba\Ba a bir a akelime sınırı yok
\G\Gaaa aaaÖnceki başarılı arama, arama 4 konumunda durduruldu - burada a bulunamadı
PDF, PNG olarak indirin.

çapalar

Normal ifadelerdeki çapalar, bir şeyin başlangıcını veya sonunu gösterir. Örneğin, satırlar veya kelimeler. Belirli sembollerle temsil edilirler. Örneğin, bir sayı ile başlayan bir dizeyle eşleşen bir kalıp şöyle görünür:

Burada ^ karakteri bir satırın başlangıcını belirtir. Onsuz, desen, bir rakam içeren herhangi bir dizeyle eşleşir.

Karakter sınıfları

Normal ifadelerdeki karakter sınıfları, aynı anda belirli bir karakter kümesiyle eşleşir. Örneğin, \d 0'dan 9'a kadar herhangi bir rakamla eşleşir, \w harfler ve sayılarla eşleşir ve \W harfler ve sayılar dışındaki tüm karakterlerle eşleşir. Harfleri, sayıları ve boşlukları tanımlayan desen şöyle görünür:

POSIX

POSIX, düzenli ifade ailesine nispeten yeni bir eklemedir. Fikir, karakter sınıflarında olduğu gibi, bazı karakter gruplarını temsil eden kısaltmalar kullanmaktır.

İfadeler

İlk başta, hemen hemen herkes ifadeleri anlamakta güçlük çeker, ancak onlara daha aşina oldukça, onları oldukça sık kullanacaksınız. İddialar, "Bu belgede arkasından 'werty' gelmeyen 'q' harfini içeren her kelimeyi bulmak istiyorum" demenin bir yolunu sağlar.

[^\s]*q(?!werty)[^\s]*

Yukarıdaki kod, boşluk ([^\s]*) ve ardından q karakteri dışında herhangi bir karakter arayarak başlar. Ayrıştırıcı daha sonra "ileriye dönük" ifadeye ulaşır. Bu, önceki öğeyi (karakter, grup veya karakter sınıfı) otomatik olarak koşullu yapar - yalnızca iddia doğruysa modelle eşleşir. Bizim durumumuzda, ifade olumsuzdur (?!), yani, aradığı bulunmazsa doğru olacaktır.

Böylece, ayrıştırıcı önerilen desene (werty) göre sonraki birkaç karakteri kontrol eder. Bulunurlarsa, ifade yanlıştır, bu da q karakterinin "yok sayılacağı", yani modelle eşleşmeyeceği anlamına gelir. Eğer werty bulunamazsa, o zaman ifade doğrudur ve q ile her şey yolundadır. Ardından boşluk ([^\s]*) dışındaki karakterleri aramaya devam eder.

niceleyiciler

Niceleyiciler, arka arkaya birden çok kez tekrarlanması gereken bir kalıbın bir bölümünü tanımlamanıza olanak tanır. Örneğin, bir belgenin 10 ila 20 (dahil) harf "a" içeren bir dize içerip içermediğini öğrenmek istiyorsanız, bu kalıbı kullanabilirsiniz:

Bir(10,20)

Varsayılan olarak, niceleyiciler açgözlüdür. Bu nedenle, "bir veya daha fazla kez" anlamına gelen niceleyici + mümkün olan maksimum değerle eşleşecektir. Bazen bu sorunlara neden olur ve ardından niceleyiciye özel bir değiştirici kullanarak açgözlü olmayı bırakmasını ("tembel" olmasını) söyleyebilirsiniz. Bu koda bakın:

".*"

Bu kalıp, çift tırnak içine alınmış metinle eşleşir. Ancak, orijinal satırınız şöyle olabilir:

Selam Dünya

Yukarıdaki şablon, bu dizgede aşağıdaki alt dizgiyi bulacaktır:

"helloworld.htm" title="(!LANG:Merhaba Dünya" !}

Çok açgözlüydü, elinden gelen en büyük metin parçasını yakalıyordu.

".*?"

Bu model ayrıca çift tırnak içine alınmış karakterlerle de eşleşir. Ancak tembel sürüm (değiştiriciye dikkat edin?) Mümkün olan en küçük oluşumu arar ve bu nedenle çift tırnaklı her alt dizeyi ayrı ayrı bulur:

"merhabaworld.htm" "Merhaba Dünya"

Normal ifadelerde kaçış

Normal ifadeler, bir kalıbın farklı bölümlerini temsil etmek için bazı karakterler kullanır. Ancak, bir dizgede bu karakterlerden birini normal bir karakter olarak bulmanız gerekiyorsa bir sorun vardır. Örneğin, normal bir ifadedeki bir nokta, "satır sonu dışında herhangi bir karakter" anlamına gelir. Bir dizgede nokta bulmanız gerekiyorsa, sadece " kullanamazsınız. » joker karakter olarak - bu hemen hemen her şeyi bulacaktır. Bu nedenle, ayrıştırıcıya bu noktanın "herhangi bir karakter" olarak değil, normal bir nokta olarak ele alınması gerektiğini söylemelisiniz. Bu bir kaçış karakteri ile yapılır.

Nokta gibi bir karakterden önce gelen bir kaçış karakteri, ayrıştırıcının işlevini yok saymasına ve ona normal bir karakter gibi davranmasına neden olur. Çoğu şablonda ve dilde bu tür kaçmayı gerektiren birkaç karakter vardır. Bunları hile sayfasının sağ alt köşesinde bulabilirsiniz ("Meta Semboller").

Bir nokta bulmak için şablon:

\.

Normal ifadelerdeki diğer özel karakterler, metindeki olağandışı öğelerle eşleşir. Örneğin satır sonları ve sekmeler klavyeden yazılabilir, ancak programlama dillerini karıştırması muhtemeldir. Burada kaçış karakteri, ayrıştırıcıya bir sonraki karakteri normal bir harf veya sayı olarak değil, özel bir karakter olarak ele almasını söylemek için kullanılır.

Normal ifadelerde kaçış karakterleri

dize değiştirme

Dize ikamesi bir sonraki "Gruplar ve aralıklar" bölümünde ayrıntılı olarak açıklanmaktadır, ancak burada "pasif" grupların varlığından bahsedilmelidir. Bunlar, şablonda "veya" koşulunu kullanmak istiyorsanız, ancak bu grubun ikamede yer almasını istemiyorsanız çok kullanışlı olan, ikame sırasında yok sayılan gruplardır.

Gruplar ve aralıklar

Gruplar ve aralıklar çok ama çok faydalıdır. Aralıklarla başlamak muhtemelen daha kolaydır. Bir dizi uygun karakter belirlemenize izin verirler. Örneğin, bir dizenin onaltılık basamaklar (0 ila 9 ve A ila F) içerip içermediğini kontrol etmek için aşağıdaki aralığı kullanın:

Tersini test etmek için, bizim durumumuzda 0 ile 9 arasındaki sayılar ve A ile F arasındaki harfler dışında herhangi bir karakterle eşleşen negatif bir aralık kullanın:

[^A-Fa-f0-9]

Gruplar genellikle bir şablonda "veya" koşulu gerektiğinde kullanılır; bir şablonun başka bir bölümünden bir bölümüne başvurmanız gerektiğinde; hem de dizeleri değiştirirken.

"Veya" kullanmak çok basittir: aşağıdaki kalıp "ab" veya "bc"yi arar:

Normal ifadede önceki gruplardan herhangi birine başvurmanız gerekiyorsa, \n kullanmalısınız, burada n yerine istenen grubun numarasını değiştirin. "aaa" veya "bbb" harfleriyle, ardından bir sayı ve ardından aynı üç harfle eşleşen bir desen isteyebilirsiniz. Bu model, gruplar kullanılarak uygulanır:

(aaa|bbb)+\1

Desenin ilk kısmı, bulunan harfleri bir grup halinde birleştirerek "aaa" veya "bbb" arar. Bunu bir veya daha fazla basamak (+) ve son olarak \1 araması takip eder. Şablonun son kısmı ilk gruba atıfta bulunur ve aynısını arar. Modelin ilk kısmı tarafından zaten bulunan metinle eşleştirmek yerine, eşleşme arar. Dolayısıyla "aaa123bbb" yukarıdaki modelle eşleşmeyecektir, çünkü \1 sayıdan sonra "aaa"yı arayacaktır.

En iyilerinden biri kullanışlı araçlar normal ifadelerde dize ikamesidir. Metni değiştirirken, $n kullanarak bulunan gruba başvurabilirsiniz. Diyelim ki metninizdeki tüm "dilek" kelimelerini kalın yapmak istiyorsunuz. Bunu yapmak için, şöyle görünebilecek normal ifade değiştirme işlevini kullanmalısınız:

Değiştir(desen, değiştirme, konu)

İlk parametre şunun gibi olacaktır (bu özel fonksiyon için fazladan birkaç karaktere ihtiyacınız olabilir):

([^A-Za-z0-9])(dilek)([^A-Za-z0-9])

Harf veya sayı olmadıkça, önceki ve sonraki karakterlerle birlikte "dilek" kelimesinin herhangi bir oluşumunu bulacaktır. O zaman ikameniz şöyle olabilir:

$1$2$3

Desen tarafından bulunan tüm dizenin yerini alacaktır. Değiştirmeye, bulunan ilk karakterden (bu bir harf veya sayı değil) başlıyoruz ve onu $1 ile işaretliyoruz. Onsuz, bu karakteri metinden çıkarırdık. Aynı şey ikamenin sonu için de geçerlidir (3$). ortasında ekledik HTML etiketi kalın için (elbette bunun yerine CSS kullanabilirsiniz veya ), model tarafından bulunan ikinci grubu vurgulayarak (2 $).

Şablon değiştiriciler

Şablon değiştiriciler, başta Perl olmak üzere birçok dilde kullanılmaktadır. Ayrıştırıcının nasıl çalıştığını değiştirmenize izin verirler. Örneğin, i değiştiricisi, ayrıştırıcının büyük/küçük harf durumunu göz ardı etmesine neden olur.

Perl'deki normal ifadeler, başında ve sonunda aynı karakterle çerçevelenir. Herhangi bir karakter olabilir (daha yaygın olarak "/") ve şöyle görünür:

/Desen/

Değiştiriciler bu satırın sonuna şu şekilde eklenir:

/desen/i

meta karakterler

Son olarak, tablonun son kısmı meta karakterleri içerir. Bunlar, normal ifadelerde özel anlamı olan karakterlerdir. Yani bunlardan birini normal bir karakter olarak kullanmak istiyorsanız, o zaman kaçmanız gerekir. Bir metinde parantez olup olmadığını kontrol etmek için aşağıdaki kalıp kullanılır:

Hile sayfası, herhangi bir dilin özelliklerine bakılmaksızın düzenli ifade kalıpları için genel bir kılavuzdur. Basılı bir A4 kağıda sığan bir tablo şeklinde sunulur. Dave Child'ın bir kopya kağıdına dayalı olarak Creative Commons lisansı altında oluşturulmuştur. PDF, PNG olarak indirin.


Normal ifade, bir karakter desenini tanımlayan bir nesnedir. JavaScript'teki RegExp sınıfı, normal ifadeleri temsil eder ve String ve RegExp sınıflarının nesneleri, kalıp eşleştirme ve metin değiştirme işlemlerini gerçekleştirmek için normal ifadeleri kullanan yöntemleri tanımlar.

Normal ifadeler, gelen verileri işlemek için güçlü bir araçtır. Metin değiştirme veya arama gerektiren bir görev, bu “dil içinde dil” ile güzel bir şekilde çözülebilir.

oluşturma

JavaScript'te normal ifadeler, RegExp nesneleri tarafından temsil edilir. RegExp nesneleri, RegExp() yapıcısı kullanılarak oluşturulabilir, ancak daha sıklıkla özel değişmez sözdizimi kullanılarak oluşturulurlar. Oluşturmanın yolları:

// Bir normal ifade değişmezi kullanma: var re = /ab+c/;

Normal ifade değişmezleri, komut dosyası ayrıştırıldığında normal ifadenin önceden derlenmesine neden olur.

// RegExp nesnesinin yapıcı işlevinin çağrılması var re = new RegExp("ab+c");

Yapıcıyı kullanmak, normal ifadenin komut dosyası zamanında derlenmesini gerektirir. Kullanmak Bu taraftan ifadenin değişeceği biliniyorsa gereklidir.

Normal ifadede özel karakterler

\ – Normal karakterler için onları özel kılar. Örneğin, /s/ ifadesi sadece 's' karakterini arar. Ve s'nin önüne \ koyarsanız, /\s/ zaten bir boşluk karakteri anlamına gelir.

^ – Giriş verilerinin başlangıcını gösterir. Çok satırlı arama bayrağı (“m”) ayarlanmışsa, başlangıçta da çalışacaktır. Yeni hat.

$ – Girilen verilerin sonunu gösterir. Çok satırlı arama bayrağı ayarlanmışsa, satırın sonunda da çalışacaktır.

* – 0 veya daha fazla kez tekrarı ifade eder. Örneğin, /bo*/ "Bir hayalet booooed" içinde 'boooo' ve "Bir kuş öttü" içinde 'b' bulur, ancak "Bir keçi homurdandı" içinde hiçbir şey bulamaz.

+ – 1 veya daha fazla kez tekrarı ifade eder. (1,) ile eşdeğerdir. Örneğin, /a+/ 'şeker'de 'a'yı ve 'caaaaaaaandy'de tüm 'a'yı bulacaktır.

? – Elemanın mevcut olabileceğini veya olmayabileceğini gösterir.

. – (Ondalık nokta) yeni satır dışındaki herhangi bir karakteri belirtir: \n \r \u2028 veya \u2029. (yeni satırlar dahil herhangi bir karakteri aramak için [\s\S] kullanabilirsiniz).

(x)– x'i bulur ve hatırlar. Buna "parantezleri hatırla" denir. Örneğin, /(foo)/, "foo bar"da "foo"yu bulacak ve hatırlayacaktır. Bulunan alt dizi, arama sonucu dizisinde veya RegExp nesnesinin önceden tanımlanmış özelliklerinde depolanır: $1, …, $9.

(?:x)– x'i bulur, ancak ne bulduğunu hatırlamaz. Buna "hatırlanmayan parantezler" denir. Bulunan alt dize, sonuç dizisinde ve RegExp özelliklerinde saklanmaz. Tüm parantezler gibi, içindekileri tek bir alt modelde birleştirin.

x(?=y)– Yalnızca x'in ardından y geliyorsa x'i bulur. Örneğin, /Jack(?=Sprat)/ yalnızca 'Jack'i, ardından 'Sprat' geliyorsa bulur. /Jack(?=Sprat|Frost)/ yalnızca 'Jack' ile, ardından 'Sprat' veya 'Frost' geliyorsa eşleşir. Ancak, arama sonucunda ne 'Çaça' ne de 'Don' görünmez.

x(?!y)– Yalnızca x'in ardından y yoksa x'i bulur. Örneğin, /\d+(?!\.)/ yalnızca bir sayıyı bir ondalık nokta izlemiyorsa eşleştirir. /\d+(?!\.)/.exec(“3.141”) 141'i bulur ancak 3.141'i bulamaz.

x|y– x veya y'yi bulur. Örneğin, /green|red/, "yeşil elma"daki 'yeşil' ve "kırmızı elma"daki 'kırmızı' ile eşleşir.

(n)– Pozitif bir tam sayı. Önceki öğenin tam olarak n tekrarını bulur.

(n,)– Pozitif bir tam sayı. Bir öğenin n veya daha fazla örneğini bulur.

(n,m)- Pozitif tam sayılar. Bir elemanın n'den m'ye tekrarını bulun.

- Karakter seti. Listelenen karakterlerden herhangi birini bulur. Bir tire kullanarak bir yayılma alanı belirtebilirsiniz. Örneğin, ile aynıdır.

[^xyz]– Kümede belirtilenler dışında herhangi bir karakter. Ayrıca bir aralık belirtebilirsiniz. Örneğin, [^abc], [^a-c] ile aynıdır.

[\B]– Bir geri alma karakteri bulur.

\B– Kelimelerin (Latince) sınırlarını bulur.

\B– Kelime sınırı olmadığını belirtir. Örneğin, /\w\Bn/ "öğlen"de "on" ile eşleşir ve /y\B\w/ "muhtemelen dün"de "ye" ile eşleşir.

\cX– X, A'dan Z'ye bir harftir. Bir dizgede bir kontrol karakteri belirler. Örneğin, /\cM/ Ctrl-M karakterini temsil eder.

\D– Herhangi bir alfabeden bir sayı bulur.

\D– Sayısal olmayan bir karakter bulur (tüm harfler). [^0-9] normal rakamların karşılığıdır.

\f,\r,\n– Eşleşen özel karakterler form besleme, satır besleme, satır besleme.

\s– Boşluklar, sekmeler, yeni satırlar ve diğer unicode boşluk karakterleri dahil olmak üzere herhangi bir boşluk karakteriyle eşleşir.

\S– Boşluk dışında herhangi bir karakterle eşleşir.

\T- Sekme karakteri.

\v– Dikey sekme karakteri.

\w– Harfler, sayılar ve alt çizgiler dahil olmak üzere herhangi bir (Latin) kelime karakteriyle eşleşir. Eşittir .

\W– Herhangi bir (Latin olmayan) kelime karakteriyle eşleşir. [^A-Za-z0-9_] ile eşdeğerdir.

\0 – NUL karakterini bulur.

\xhh– hh (2 onaltılık basamak) kodlu karakteri arar.

\uhhhh– hhhh (4 onaltılık basamak) kodlu karakteri arar.

Bayraklar

Normal ifade bayrakları, üst düzey desen eşleştirme kurallarını tanımlar. Normal ifade dilbilgisinin geri kalanından farklı olarak, bayraklar eğik çizgi karakterleri arasında değil, ikincisinden sonra belirtilir. JavaScript dili üç bayrağı destekler.

bayrak Bence desen eşleştirmenin büyük/küçük harfe duyarsız olması gerektiğini belirtir ve bayrak G– aramanın global olması gerektiği, yani dizedeki tüm eşleşmeler bulunmalıdır. bayrak mçok satırlı modda bir desen araması gerçekleştirir. Aranan dize ifadesi yeni satırlar içeriyorsa, bu modda ^ ve $ bağlantı karakterleri, tüm dize ifadesinin başlangıcını ve sonunu eşleştirmenin yanı sıra her metin satırının başlangıcını ve sonunu da eşleştirir. Bayraklar herhangi bir kombinasyonda birleştirilebilir.

Dize sınıfı yöntemleri

Dizeler, normal ifadeler kullanan dört yöntemi destekler.

arama() yöntemi

Argüman olarak normal bir ifade alır ve bulunan alt dizenin ilk karakterinin konumunu veya eşleşme bulunamazsa -1'i döndürür. Örneğin, aşağıdaki çağrı 4 döndürür:

Varresult = "JavaScript".search(/script/i); // 4

search() yöntemi argümanı normal bir ifade değilse, önce RegExp yapıcısına iletilerek dönüştürülür. search() yöntemi genel aramaları desteklemez ve bayrağı yok sayar G senin argümanında.

replace() yöntemi

Bir arama ve değiştirme işlemi gerçekleştirir. İlk argümanı olarak normal bir ifade ve ikinci argümanı olarak bir yedek dize alır. Yöntem, belirtilen kalıpla eşleşmesi için çağrıldığı dizeyi arar. Normal ifade g bayrağını içeriyorsa, replace() yöntemi, bulunan tüm eşleşmeleri değiştirme dizesiyle değiştirir. Aksi takdirde, yalnızca bulunan ilk eşleşmenin yerini alır.

maç() yöntemi

Tek argümanı olarak normal bir ifadeyi alır (veya argümanını RegExp() yapıcısına ileterek normal ifadeye dönüştürür) ve arama sonuçlarını içeren bir dizi döndürür. Normal ifadede g bayrağı ayarlanırsa, yöntem dizede bulunan tüm eşleşmelerin bir dizisini döndürür. Örneğin:

// ["1", "2", "3"] döndürür var sonuç = "1 artı 2 eşittir 3".match(/\d+/g);

Normal ifade g bayrağını içermiyorsa, match() yöntemi genel bir arama gerçekleştirmez; sadece ilk eşleşmeyi arar. Ancak match(), yöntem genel bir arama yapmasa bile bir dizi döndürür. Bu durumda, dizinin ilk öğesi bulunan alt dizedir ve kalan tüm öğeler normal ifadenin alt ifadeleridir.

split() yöntemi

Bu yöntem, sınırlayıcı olarak bağımsız değişkeni kullanarak çağrıldığı dizeyi bir dizi alt dizeye böler. Örneğin:

"123.456,789".split(","); // ["123","456","789"] döndürür

split() yöntemi ayrıca argüman olarak normal bir ifade alabilir. Bu, yöntemi daha güçlü hale getirir.

normal ifade nesnesi

RegExp() yapıcısı bir veya iki dize argümanı alır ve yeni bir RegExp nesnesi oluşturur. Yapıcıya yönelik ilk argüman, normal ifadenin gövdesini içeren bir dizedir, yani. normal ifade değişmezinde eğik çizgiler arasında görünmesi gereken metin. RegExp() için ikinci argüman eksik olabilir. Belirtilirse, normal ifade bayraklarını belirtir. karakterlerden biri olmalı g, ben, m veya bu karakterlerin bir kombinasyonu.

Normal ifade özellikleri

Her RegExp nesnesinin beş özelliği vardır:

  • kaynak– normal ifadenin metnini içeren salt okunur bir dize.
  • küresel– bayrağın varlığını gösteren salt okunur bir boole G düzenli bir ifadede.
  • yok saymak Bence düzenli bir ifadede.
  • çok satırlı bayrağın varlığını gösteren salt okunur bir boole m düzenli bir ifadede.
  • lastIndex okunabilen ve yazılabilen bir tamsayıdır. Bayrak şablonları için G bu özellik, bir sonraki aramanın başlaması gereken dizideki konum numarasını içerir.

Normal İfade Yöntemleri

RegExp nesneleri, desen eşleştirme gerçekleştiren iki yöntemi tanımlar.

exec() yöntemi

exec() yöntemi, belirtilen dize için normal ifadeyi yürütür, yani. bir dizgede bir eşleşme arar. Eşleşme bulunamazsa, yöntem null değerini döndürür. Ancak, bir eşleşme bulunursa, bayrak olmadan arama yapmak için match() yöntemi tarafından döndürülen diziyle aynı diziyi döndürür. G.

Dizinin sıfır öğesi, normal ifadeyle eşleşen dizeyi içerir ve sonraki tüm öğeler, tüm alt ifadelerle eşleşen alt dizelerdir. Match()'den farklı olarak, exec() yöntemi, yapısı normal ifadedeki bayrağın varlığına bağlı olmayan bir dizi döndürür. G.

exec() yöntemi aynı normal ifade için ikinci kez çağrıldığında, lastIndex özelliğinde belirtilen karakter konumunda aramaya başlar. exec() bir eşleşme bulamazsa, lastIndex özelliği 0'a ayarlanır.

test metodu

Bir dize alır ve dize normal ifadeyle eşleşirse true değerini döndürür:

Varpattern = /java/i; model.test("JavaScript"); // true döndür

test() öğesinin çağrılması, exec() öğesinin null olmayan bir değer döndürmesi durumunda true öğesinin çağrılmasıyla eşdeğerdir. Bu nedenle, test() yöntemi, global bir düzenli ifadede çağrıldığında exec() yöntemiyle aynı şekilde davranır: aramaya başlar. belirtilen dize lastIndex özelliği tarafından belirtilen konumdan alır ve bir eşleşme bulursa, lastIndex özelliğini eşleşmeden hemen sonraki karakterin konum numarasına ayarlar.

Şablon Yazma

Normal ifade kalıbı, /abc/ gibi sıradan karakterlerden veya /ab*c/ veya /Bölüm (\d+)\.\d*/ gibi sıradan ve özel karakterlerin kombinasyonlarından oluşur. Son örnek, "bellek mekanizması" olarak kullanılan parantezleri içerir. Desenin bu kısmıyla eşleşme daha sonra kullanılmak üzere hatırlanır.

Basit Şablonları Kullanma

Metinde doğrudan eşleşmeleri bulmak için basit desenler kullanılır. Örneğin, /abc/ kalıbı, yalnızca 'abc' karakterleri birlikte ve aynı sırada yer aldığında bir dizedeki karakter kombinasyonuyla eşleşir.

Düzenli ifadeler ( Normalİfade) - bu çok etkili yöntem dize çalışması.

Özel sözdizimi kullanarak normal bir ifade oluşturarak şunları yapabilirsiniz:

  • arama metniÇizgide
  • alt dizeleri değiştirÇizgide
  • bilgi ayıklamak dizeden

Hemen hemen tüm programlama dillerinde düzenli ifadeler bulunur. Uygulamada küçük farklılıklar vardır, ancak genel kavramlar hemen hemen her yerde geçerlidir.

Düzenli ifadeler, dize işleme algoritmaları için kavramsal bir arama modeli olarak resmileştirildikleri 1950'lere kadar uzanır.

UNIX'te uygulanan grep, sed ve popular gibi düzenli ifadeler metin editörleri, popülerlik kazanmaya başladı ve Perl programlama diline ve daha sonra diğer birçok dile eklendi.

JavaScript, Perl ile birlikte, dilin içine yerleştirilmiş düzenli ifade desteğine sahip programlama dillerinden biridir.

zor ama yardımcı

Normal ifadeler, yeni başlayanlar için mutlak saçmalık gibi görünebilir ve onları anlamak için gerekli zamanı ayırmazsanız, çoğu zaman profesyonel geliştiricilere bile.

Düzenli ifadeler yazmak zor, Okunması zor ve bakımı/değiştirilmesi zor.

Ancak bazen düzenli ifadeler tek mantıklı yol bir tür dizi manipülasyonu gerçekleştirin, bu nedenle çok değerli bir araçtır.

Bu kılavuzun amacı basit bir şekilde JavaScript'teki normal ifadeleri biraz anlamanızı sağlamak ve normal ifadelerin nasıl okunacağı ve oluşturulacağı hakkında bilgi sağlamak için.

Temel kural şu ​​ki basit düzenli ifadelerin okunması ve yazılması kolaydır, sırasında karmaşık düzenli ifadeler hızla bir karmaşaya dönüşebilir Temelleri derinlemesine anlamadıysanız.

Normal ifadeler nasıl görünür?

JavaScript'te normal ifade, iki şekilde tanımlanabilen bir nesnedir.

İlk yol, yaratmaktır. yeni RegExp nesnesi yapıcıyı kullanarak:

Const re1 = yeni RegExp("hey")

İkinci yol kullanmaktır düzenli ifade değişmezleri:

Sabit re1 = /hey/

JavaScript'in ne olduğunu biliyor musun? nesne değişmezleri ve dizi değişmezleri? Ayrıca .... sahip normal ifade değişmezleri.

Yukarıdaki örnekte, hey denir şablon. Kelimenin tam anlamıyla, iki eğik çizgi arasındadır, ancak bir nesne oluşturucu durumunda değildir.

Bu, normal ifadeleri tanımlamanın iki yolu arasındaki ilk önemli farktır, gerisini daha sonra göreceğiz.

Nasıl çalışırlar?

Yukarıda re1 olarak tanımladığımız normal ifade çok basittir. hey dizesini herhangi bir kısıtlama olmaksızın arar: dize çok fazla metin içerebilir ve hey kelimesi ortada bir yerdedir ve normal ifade işe yarayacaktır. Dize yalnızca hey kelimesini içerebilir ve normal ifade tekrar çalışır.

Oldukça basit.

Bir boole değeri döndüren RegExp.test(String) yöntemiyle normal ifadeyi test etmeyi deneyebilirsiniz:

Re1.test("hey") // ✅ re1.test("blablabla hey blablabla") // ✅ re1.test("o") // ❌ re1.test("blablabla") // ❌

Yukarıdaki örnekte, "hey" ifadesinin re1'de depolanan normal ifade modeliyle eşleşip eşleşmediğini kontrol ettik.

Armutları bombalamak kadar kolay, ancak düzenli ifadeler hakkında zaten çok şey biliyorsunuz.

demirleme

/Hey/

dize içinde hey nerede olursa olsun çalışacaktır.

hey ile başlayan satırları bulmak istiyorsanız, ^ operatörünü kullanın:

/^hey/.test("hey") // ✅ /^hey/.test("hey hey") // ❌

hey ile biten satırları bulmak istiyorsanız, $ operatörünü kullanın:

/hey$/.test("hey") // ✅ /hey$/.test("hey hey") // ✅ /hey$/.test("hey sen") // ❌

Önceki iki ifadeyi birleştirerek, hey ile tam olarak eşleşen bir satır bulabilirsiniz:

/^hey$/.test("hey") // ✅

Bir alt dizeyle başlayan ve başka bir alt dizeyle biten bir dize bulmak için, 0 veya daha fazla kez tekrarlanan herhangi bir karakterle eşleşecek olan .* öğesini kullanabilirsiniz:

/^hey.*joe$/.test("hey joe") // ✅ /^hey.*joe$/.test("heyjoe") // ✅ /^hey.*joe$/.test("hey joe nasılsın") // ✅ /^hey.*joe$/.test("hey joe!") // ❌

Aralığa göre eleman bulma

Belirli bir dize aramak yerine, aşağıdaki gibi bir dizi karakter belirtebilirsiniz:

// // a, b, c, ... , x, y, z // // A, B, C, ... , X, Y, Z // // a, b, c // / / 0, 1, 2, 3, ... , 8, 9

Bu normal ifadeler, seçilen aralıktan en az bir karakter içeren dizeleri arar:

//.test("a") // ✅ //.test("1") // ❌ //.test("A") // ❌ //.test("d") // ❌ // .test("dc") // ✅

Aralıklar birleştirilebilir:

// //.test("a") // ✅ //.test("1") // ✅ //.test("A") // ✅

Bir Aralık Öğesinin Birden Çok Eşleşmesini Bulma

- karakterini kullanarak bir dizenin bir aralıktan yalnızca bir karakter içerip içermediğini kontrol edebilirsiniz:

/^$/ /^$/.test("A") // ✅ /^$/.test("Ab") // ❌

Desen inversiyonu

Bir kalıbın başındaki ^ karakteri onu satırın başına sabitler.

Bu karakteri bir aralık içinde kullanmak, aralığı tersine çevirir, bu nedenle:

/[^A-Za-z0-9]/.test("a") // ❌ /[^A-Za-z0-9]/.test("1") // ❌ /[^A-Za -z0-9]/.test("A") // ❌ /[^A-Za-z0-9]/.test("@") // ✅

meta karakterler

  • \d herhangi bir sayıyla eşleşir, eşdeğerdir
  • \D, sayı olmayan, [^0-9] ile eşdeğer olan herhangi bir karakterle eşleşir
  • \w herhangi bir alfasayısal karakterle eşleşir, buna eşdeğerdir
  • \W, [^A-Za-z0-9] ile eşdeğer, alfasayısal bir değer olmayan herhangi bir karakterle eşleşir
  • \s herhangi bir boşluk karakteriyle eşleşir: boşluk, sekme, yeni satır ve Unicode boşlukları
  • \S boşluk olmayan herhangi bir karakterle eşleşir
  • \0 null ile eşleşir
  • \n yeni satır karakteriyle eşleşiyor
  • \t bir sekme karakteriyle eşleşir
  • \uXXXX, Unicode karakteriyle XXXX koduyla eşleşir (u bayrağını gerektirir)
  • . yeni satır (\n gibi) dışında herhangi bir karakterle eşleşir (s bayrağını kullanmazsanız, daha sonra açıklanacaktır)
  • [^], yeni satır karakteri de dahil olmak üzere herhangi bir karakterle eşleşir. Çok satırlı dizelerle uğraşırken kullanışlıdır

Normal ifadelerde seçim

birini seçmek istersen veya başka bir satırda | .

/hey|ho/.test("hey") // ✅ /hey|ho/.test("ho") // ✅

niceleyiciler

Bir dizenin yalnızca bir rakam içerip içermediğini kontrol eden normal bir ifadeniz olduğunu hayal edin:

kullanabilirsiniz niceleyici? , bu karakteri isteğe bağlı yapacak. Bizim durumumuzda, sayı 0 veya 1 kez olmalıdır:

peki ya normal ifadenin birden çok rakamla eşleşmesini istiyorsak?

+ , * , (n) ve (n,m) kullanarak 4 şekilde yapabilirsiniz.

+

Bir veya daha fazla (>=1) öğeyle eşleşir:

/^\d+$/ /^\d+$/.test("12") // ✅ /^\d+$/.test("14") // ✅ /^\d+$/.test("144343" ) // ✅ /^\d+$/.test("") // ❌ /^\d+$/.test("1a") // ❌

*

0 veya daha fazla (>=0) öğeyle eşleşir:

/^\d+$/ /^\d*$/.test("12") // ✅ /^\d*$/.test("14") // ✅ /^\d*$/.test( "144343") // ✅ /^\d*$/.test("") // ✅ /^\d*$/.test("1a") // ❌

(n)

Tam olarak n sayıda öğeyle eşleşir:

/^\d(3)$/ /^\d(3)$/.test("123") // ✅ /^\d(3)$/.test("12") // ❌ /^\ d(3)$/.test("1234") // ❌ /^(3)$/.test("Abc") // ✅

(n,m)

n'den m'ye kadar bir dizi öğeyle eşleşir:

/^\d(3,5)$/ /^\d(3,5)$/.test("123") // ✅ /^\d(3,5)$/.test("1234") // ✅ /^\d(3,5)$/.test("12345") // ✅ /^\d(3,5)$/.test("123456") // ❌

m atlanabilir ve en az n eleman olacak şekilde ikinci sınır kısıtlanmadan bırakılır:

/^\d(3,)$/ /^\d(3,)$/.test("12") // ❌ /^\d(3,)$/.test("123") // ✅ /^\d(3,)$/.test("12345") // ✅ /^\d(3,)$/.test("123456789") // ✅

Opsiyonel elemanlar

Öğeyi takip eden karakter? , isteğe bağlı hale getirecek:

/^\d(3)\w?$/ /^\d(3)\w?$/.test("123") // ✅ /^\d(3)\w?$/.test(" 123a") // ✅ /^\d(3)\w?$/.test("123ab") // ❌

Gruplar

Parantez kullanarak karakter grupları oluşturabilirsiniz (...) .

Aşağıdaki örnek, bir veya daha fazla alfasayısal karakterin izlediği 3 basamaklı tam eşleşmeyi arar:

/^(\d(3))(\w+)$/ /^(\d(3))(\w+)$/.test("123") // ❌ /^(\d(3))( \w+)$/.test("123s") // ✅ /^(\d(3))(\w+)$/.test("123bir şey") // ✅ /^(\d(3))( \w+)$/.test("1234") // ✅

Grup kapatma parantezinden sonra görünen yinelenen karakterler tüm grup için geçerlidir:

/^(\d(2))+$/ /^(\d(2))+$/.test("12") // ✅ /^(\d(2))+$/.test(" 123") // ❌ /^(\d(2))+$/.test("1234") // ✅

Grupları yakalama

Şimdiye kadar, dizilerin nasıl test edileceğini ve belirli bir kalıp içerip içermediklerini gördük.

Normal ifadelerin harika bir özelliği, bir dizenin belirli kısımlarını yakalamak ve bunları bir diziye ekleyin.

Bunu gruplarla, daha spesifik olarak yakalama grupları.

Varsayılan olarak, gruplar bu şekilde yakalanır. Şimdi, basitçe bir boole döndüren RegExp.test(String) kullanmak yerine, aşağıdaki yöntemlerden birini kullanacağız:

  • Dize eşleşmesi(RegExp)
  • RegExp.exec(Dize)

Bunlar tamamen aynıdır ve her ikisi de ilk öğe olarak test edilen dize ile bir dizi döndürür ve kalan öğelerde bulunan her grup için bir eşleşme vardır.

Eşleşme bulunamazsa, null değerini döndürür.

"123s".match(/^(\d(3))(\w+)$/) //Dizi [ "123s", "123", "123s" ] /^(\d(3))(\w+ )$/.exec("123s") //Array [ "123s", "123", "s" ] "hey".match(/(hey|ho)/) //Array [ "hey", "hey " ] /(hey|ho)/.exec("hey") //Dizi [ "hey", "hey" ] /(hey|ho)/.exec("ha!") //null

Bir grup birden çok kez eşleştiğinde, döndürülen diziye yalnızca bulunan son değer eklenir.

"123456789".match(/(\d)+/) //Dizi [ "123456789", "9" ]

İsteğe bağlı gruplar

Yakalama grupları (...) ile isteğe bağlı hale getirilebilir? . Hiçbir şey bulunamazsa, döndürülen diziye tanımsız bir öğe eklenir:

/^(\d(3))(\s)?(\w+)$/.exec("123 s") //Array [ "123 s", "123", " ", "s" ] /^ (\d(3))(\s)?(\w+)$/.exec("123s") //Array [ "123s", "123", undefined, "s" ]

Bulunan gruba bağlantı

Bulunan her gruba bir numara atanır. $1 birinci öğeyi, $2 ikinci öğeyi vb. ifade eder. Bu, bir dizgenin bir kısmını değiştirmekten bahsettiğimizde kullanışlıdır.

Adlandırılmış grup yakalama

Bu yeni fırsat ES2018.

Döndürülen dizide yalnızca bir yuva yerine bir gruba bir ad atayabilirsiniz:

Sabit yeniden = /(? \d(4))-(? \d(2))-(? \d(2))/ const sonuç = re.exec("2015-01-02") // sonuç.gruplar.yıl === "2015"; // sonuç.gruplar.ay === "01"; // sonuç.gruplar.gün === "02";

Gruplar olmadan eşleşme ve yürütme kullanma

Gruplar olmadan eşleşme ve yürütmeyi kullanırken bir fark vardır: dizinin ilk öğesi tamamen bulunan bir dize değil, doğrudan eşleşme içerecektir:

/hey|ho/.exec("hey") // [ "hey" ] /(hey).(ho)/.exec("hey ho") // [ "hey ho", "hey", "ho "]

Yakalamayan gruplar

Gruplar varsayılan olarak yakalanabilir olduğundan, döndürülen dizideki bazı grupları yok saymanın bir yoluna ihtiyacımız var. Bu ile mümkündür ele geçirilemeyen gruplar, hangisi (?:...) ile başlar.

"123s".match(/^(\d(3))(?:\s)(\w+)$/) // null "123 s".match(/^(\d(3))(?: \s)(\w+)$/) // Dizi [ "123 s", "123", "s" ]

Bayraklar

Herhangi bir normal ifadede aşağıdaki bayrakları kullanabilirsiniz:

  • g: küresel olarak eşleşmeleri arar
  • i: normal ifadeyi büyük/küçük harfe duyarsız hale getirir
  • m: Çoklu hat modunu etkinleştirir. Bu modda, ^ ve $ tüm dizenin başlangıcı ve sonuyla eşleşir. Bu bayrak olmadan, çok satırlı dizelerle, her satırın başı ve sonuyla eşleşirler.
  • u: Unicode desteğini etkinleştirir (ES6/ES2015'te eklenmiştir)
  • s: (ES2018'de yeni) "tek satır" için kısa, izin verir. yeni satır karakterlerini eşleştir

Bayraklar birleştirilebilir ve ayrıca değişmez dizenin sonuna eklenirler:

/hey/ig.test("Hey") // ✅

veya RegExp nesnesinin yapıcısına ikinci parametre olarak iletilir:

Yeni RegExp("hey", "ig").test("HEy") // ✅

Normal İfade Denetimi

Normal ifadelerin özelliklerini inceleyebilirsiniz:

  • kaynak - şablon dizesi
  • multiline - m bayrağı ayarlanmışsa doğru
  • global - g bayrağı ayarlanmışsa true
  • görmezdenCase - i bayrağı ayarlanmışsa doğru
  • lastIndex
/^(\w(3))$/i.source //"^(\\d(3))(\\w+)$" /^(\w(3))$/i.multiline //yanlış /^(\w(3))$/i.lastIndex //0 /^(\w(3))$/i.ignoreCase //true /^(\w(3))$/i.global // YANLIŞ

ekranlama

Özel semboller:

Bunlar özel karakterlerdir çünkü normal ifade kalıpları oluştururken kontrol karakterleridirler, bu nedenle onları bir kalıp içinde eşleştirmek için kullanmak istiyorsanız, onlardan bir ters eğik çizgi karakteri ile çıkmanız gerekir:

/^\\$/ /^\^$/ // /^\^$/.test("^") ✅ /^\$$/ // /^\$$/.test("$") ✅

satır sınırları

\b ve \B, bir dizenin bir kelimenin başında mı yoksa sonunda mı olduğunu belirlemenize izin verir:

  • \b, karakter kümesi bir kelimenin başında veya sonundaysa eşleşir
  • \B, karakter kümesi bir kelimenin başında veya sonunda değilse eşleşir

"Bir ayı gördüm".match(/\bbear/) //Dizi ["ayı"] "Bir ayı gördüm".match(/\bbear/) //Array ["ayı"] "Bir ayı gördüm" .match(/\bbear\b/) //null "cool_bear".match(/\bbear\b/) //null

Normal ifadelerle değiştirme

Dizelerin bir kalıba karşı nasıl kontrol edileceğini zaten gördük.

Ayrıca, desenle eşleşen dizelerin bir kısmını bir diziye nasıl çıkarabileceğinizi de gördük.

Şimdi nasıl olduğuna bakalım bir dizenin parçalarını değiştir bir şablona dayalıdır.

JavaScript'teki String nesnesi, düzenli ifadeler olmadan kullanılabilen bir replace() yöntemine sahiptir. bir yedekÇizgide:

"Merhaba dünya!".replace("dünya", "köpek") //Merhaba köpek! "Köpeğim iyi bir köpek!".replace("köpek", "kedi") //Kedim iyi bir köpek!

Bu yöntem ayrıca argüman olarak normal bir ifade alabilir:

"Merhaba dünya!".replace(/world/, "köpek") //Merhaba köpek!

g bayrağının kullanımı tek yol bir dizedeki birden çok oluşumu vanilya JavaScript ile değiştirin:

"Köpeğim iyi bir köpek!".replace(/dog/g, "cat") //Kedim iyi bir kedi!

Gruplar, daha süslü şeyler yapmamıza, satırların parçalarını değiştirmemize izin verir:

"Merhaba dünya!".replace(/(\w+), (\w+)!/, "$2: $1!!!") // "dünya: Merhaba!!!"

Daha da ilginç şeyler yapmak için bir dize yerine bir işlev kullanabilirsiniz. Argüman sayısının grup sayısına bağlı olduğu String.match(RegExp) veya RegExp.exec(String) yöntemleri tarafından döndürülenler gibi bir dizi argüman iletilecektir:

"Merhaba dünya!".replace(/(\w+), (\w+)!/, (matchedString, birinci, saniye) => ( console.log(first); console.log(second); return `$( saniye.toUpperCase()): $(ilk)!!!` )) //"DÜNYA: Merhaba!!!"

Açgözlülük

Düzenli ifadeler denir aç gözlü varsayılan.

Bunun anlamı ne?

Örneğin bu normal ifadeyi alın:

/\$(.+)\s?/

Dizeden dolar miktarını çıkarmamız gerektiği varsayılır:

/\$(.+)\s?/.exec("Bunun maliyeti 100$") //0

ama ya sayıdan sonra daha fazla kelimemiz varsa, bu dikkat dağıtıyor

/\$(.+)\s?/.exec("Bunun maliyeti 100$ ve 200$'dan az") //100 ve 200$'dan az

Niye ya? Çünkü $ işaretinden sonraki normal ifade herhangi bir .+ karakteriyle eşleşir ve satırın sonuna ulaşana kadar durmaz. Sonra durur çünkü \s? sondaki alanı isteğe bağlı hale getirir.

Bunu düzeltmek için normal ifadenin olması gerektiğini belirtmemiz gerekiyor. tembel ve en az eşleşme sayısını bulun. Bunu bir sembolle yapabilir miyiz? niceleyiciden sonra:

/\$(.+?)\s/.exec("Bunun maliyeti 100$ ve 200$'dan az") //100

Yani sembol? konumuna bağlı olarak farklı anlamlara gelebilir, dolayısıyla hem niceleyici hem de gösterge olabilir. tembel modu.

Önceki: onu izleyene bağlı olarak bir dize eşleştirin

Bir dizeyi ve ardından belirli bir alt dizeyi eşleştirmek için ?= kullanın

/Roger(?=Waters)/ /Roger(?= Waters)/.test("Roger benim köpeğim") //false /Roger(?= Waters)/.test("Roger benim köpeğim ve Roger Waters ünlü bir müzisyen") //true

Ters işlemi gerçekleştirir ve ardından satırda eşleşmeleri bulur. olumsuzluk ardından belirli bir alt dize:

/Roger(?!Waters)/ /Roger(?! Waters)/.test("Roger benim köpeğim") //true /Roger(?! Waters)/.test("Roger benim köpeğim ve Roger Waters ünlü bir müzisyen") //false

Geriye dönük: bir dizeyi kendisinden önce gelene bağlı olarak eşleştirin

Bu, ES2018'deki yeni bir özelliktir.

Öngörü, ?= sembolünü kullanır. Retrospektif kullanımlar?<= :

/(?<=Roger) Waters/ /(?<=Roger) Waters/.test("Pink Waters is my dog") //false /(?<=Roger) Waters/.test("Roger is my dog and Roger Waters is a famous musician") //true

Retrospektif inversiyon kullanır mı?

/(?

Normal İfadeler ve Unicode

u bayrağı, Unicode dizileriyle uğraşırken, özellikle de ilk 1600 Unicode karakterinde yer almayan astral planlardaki dizileri işlemek gerektiğinde gereklidir.

Örneğin, emoji, ancak yalnızca onlar.

/^.$/.test("a") // ✅ /^.$/.test("?") // ❌ /^.$/u.test("?") // ✅

Bu nedenle, her zaman u bayrağını kullanın.

Unicode, normal karakterler gibi, aralıkları işleyebilir:

//.test("a") // ✅ //.test("1") // ✅ /[?-?]/u.test("?") // ✅ /[?-?]/u .test("?") // ❌

JavaScript dahili temsil kodlarını kontrol eder, bu yüzden mi?< ? < ? на самом деле \u1F436 < \u1F43A < \u1F98A . Посмотрите полный список эмодзи чтобы увидеть коды и узнать их порядок.

Unicode özelliklerinden kaçış

Yukarıda söylediğimiz gibi, bir normal ifade modelinde herhangi bir rakamı eşleştirmek için \d'yi, boşluk dışında herhangi bir karakteri eşleştirmek için \s'yi, herhangi bir alfasayısal karakteri eşleştirmek için \w'yi vb. kullanabilirsiniz.

Unicode özelliğinden kaçış, bu konsepti tüm Unicode karakterlerine genişleterek ve \p() ve \P() ekleyerek çok güzel bir özellik ekleyen bir ES2018 özelliğidir.

Her Unicode karakterinin bir dizi özelliği vardır. Örneğin, Komut Dosyası bir dil ailesini tanımlar, ASCII, ASCII karakterleri için doğru olan bir boole değeridir vb. Bu özelliği kaşlı ayraçlar içine koyabilirsiniz ve normal ifade, değerinin doğru olup olmadığını kontrol edecektir:

/^\p(ASCII)+$/u.test("abc") // ✅ /^\p(ASCII)+$/u.test(" [e-posta korumalı]") // ✅ /^\p(ASCII)+$/u.test("ABC?") // ❌

ASCII_Hex_Digit, bir dizenin yalnızca geçerli onaltılık basamaklar içerip içermediğini kontrol eden başka bir boole özelliğidir:

/^\p(ASCII_Hex_Digit)+$/u.test("0123456789ABCDEF") //✅ /^\p(ASCII_Hex_Digit)+$/u.test("h")

Büyük harf , Küçük harf , White_Space , Alphabetic , Emoji ve daha fazlası dahil olmak üzere, adlarını küme parantezlerine ekleyerek kontrol edebileceğiniz birçok boole özelliği vardır:

/^\p(Küçük Harf)$/u.test("h") // ✅ /^\p(Büyük Harf)$/u.test("H") // ✅ /^\p(Emoji)+$/ u.test("H") // ❌ /^\p(Emoji)+$/u.test("??") // ✅

Bu ikili özelliklere ek olarak, belirli bir değerle eşleşmesi için bir Unicode karakterinin herhangi bir özelliğini test edebilirsiniz. Aşağıdaki örnekte, dizenin Yunan veya Latin alfabesiyle yazılmış olup olmadığını kontrol ediyorum:

/^\p(Script=Yunanca)+$/u.test("ελληνικά") // ✅ /^\p(Script=Latin)+$/u.test("hey") // ✅

Örnekler

Bir diziden sayı çıkarma

Çıkarılacak yalnızca bir sayı içeren bir dize olduğunu varsayalım. /\d+/ şunu yapmalıdır:

"123123329 Testi".match(/\d+/) // Dizi [ "123123329" ]

E-posta adresi arama:

En basit yaklaşım, \S kullanarak @ işaretinden önce ve sonra boşluk olmayan karakterleri kontrol etmektir:

/(\S+)@(\S+)\.(\S+)/ /(\S+)@(\S+)\.(\S+)/.exec(" [e-posta korumalı]") //["[e-posta korumalı]", "copesc", "gmail", "com"]

Ancak bu, çok sayıda geçerli olmayan e-posta adresi içerdiğinden basit bir örnektir.

Çift tırnak arasında metin yakalama

Çift tırnak içine alınmış metin içeren bir dizginiz olduğunu ve bu metni çıkarmanız gerektiğini düşünelim.

Bunu yapmanın en iyi yolu kullanmaktır. grup yakalama, çünkü eşleşmemizin " ile başlayıp bitmesi gerektiğini bildiğimizden, kalıbı kolayca özelleştirebiliriz, ancak bu alıntıları sonuçtan da kaldırmak istiyoruz.

Sonuç olarak ihtiyacımız olanı bulacağız:

Const merhaba = "Merhaba "güzel çiçek"" const sonuç = /"([^"]*)"/.exec(merhaba) //Dizi [ "\"güzel çiçek\"", "güzel çiçek" ]

HTML etiketinden içerik alma

Örneğin, etiket için herhangi bir sayıda bağımsız değişkene izin verirken içeriği span etiketinden alın:

/]*>(.*?)<\/span>/ /]*>(.*?)<\/span>/.exec("deneme") // boş / ]*>(.*?)<\/span>/.exec("deneme") // ["deneme", "deneme"] / ]*>(.*?)<\/span>/.exec(" Ölçek") // ["Ölçek", "Ölçek"]