Javascript, boş dizeye nasıl izin verileceğini regex'ler. JavaScript düzenli ifadeleri

  • 18.06.2019

Düzenli ifadeler

Düzenli ifade bir karakter desenini tanımlayan bir nesnedir. JavaScript'teki RegExp sınıfı, normal ifadeleri temsil eder ve String ve RegExp sınıfı nesneleri, değiştirme ile metin üzerinde kalıp eşleştirme ve arama işlemleri gerçekleştirmek için normal ifadeleri kullanan yöntemleri tanımlar. JavaScript'teki normal ifade dilbilgisi, Perl 5'te kullanılan normal ifade sözdiziminin oldukça eksiksiz bir alt kümesini içerir, bu nedenle Perl konusunda deneyimliyseniz, JavaScript programlarındaki kalıpları kolayca tanımlayabilirsiniz.

Perl düzenli ifadelerinin ECMAScript'te desteklenmeyen özellikleri arasında s (tek satır modu) ve x (genişletilmiş sözdizimi) bayrakları bulunur; \ a, \ e, \ l, \ u, \ L, \ U, \ E, \ Q, \ A, \ Z, \ z ve \ G kaçış dizileri ve (?.

Normal ifadeleri tanımlama

JavaScript'te normal ifadeler nesnelerle temsil edilir. Normalİfade... 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. Dize değişmezleri tırnak içine alınmış karakterler olarak belirtildiği gibi, normal ifade değişmezleri de eğik çizgi (/) çifti içine alınmış karakterler olarak belirtilir. Bu nedenle, JavaScript kodu aşağıdaki gibi dizeler içerebilir:

Var desen = / s $ /;

Bu satır yeni bir RegExp nesnesi oluşturur ve onu model değişkenine atar. Bu RegExp nesnesi, "s" karakteriyle biten tüm dizeleri arar. Aynı normal ifade, RegExp () yapıcısı kullanılarak tanımlanabilir:

Var desen = yeni RegExp ("s $");

Normal ifade kalıbı belirtimi, bir dizi karakterden oluşur. Tüm alfasayısal karakterler de dahil olmak üzere çoğu karakter, olması gereken karakterleri tam anlamıyla tanımlar. Diğer bir deyişle, / Java / normal ifadesi, "Java" alt dizesini içeren tüm dizelerle eşleşir.

Normal ifadelerdeki diğer karakterlerin tam eşdeğerlerini bulmak için kullanılması amaçlanmamıştır, bunun yerine özel anlamları vardır. Örneğin, / s $ / normal ifadesi iki karakter içerir. İlk s, değişmez bir karakter aramasını gösterir. İkincisi, $ satırın sonunu gösteren özel bir meta karakterdir. Dolayısıyla bu normal ifade, s ile biten herhangi bir dizeyle eşleşecektir.

Aşağıdaki bölümlerde, JavaScript'teki normal ifadelerde kullanılan çeşitli karakterler ve meta karakterler açıklanmaktadır.

Değişmez karakterler

Daha önce belirtildiği gibi, normal ifadelerdeki tüm alfabetik karakterler ve sayılar kendileriyle eşleşir. JavaScript'teki normal ifade sözdizimi, ters eğik çizgi (\) ile başlayan kaçış dizilerini kullanarak bazı alfabetik olmayan karakterleri belirtme yeteneğini de destekler. Örneğin, \ n bir satır besleme karakteriyle eşleşir. Bu semboller aşağıdaki tabloda listelenmiştir:

Bazı noktalama işaretlerinin normal ifadelerde özel anlamları vardır:

^ $ . * + ? = ! : | \ / () { } -

Bu sembollerin anlamı aşağıdaki bölümlerde açıklanmıştır. Bazıları yalnızca belirli regex bağlamlarında özel bir anlama sahipken, diğer bağlamlarda tam anlamıyla alınırlar. Ancak tipik olarak, bu karakterlerden herhangi birini bir normal ifadeye tam anlamıyla dahil etmek için, başına ters eğik çizgi eklemeniz gerekir. Tırnak işaretleri ve @ gibi diğer karakterlerin özel bir anlamı yoktur ve yalnızca normal ifadelerde kendilerini eşleştirirler.

Hangi karakterin önüne bir \ gelmesi gerektiğini tam olarak hatırlayamıyorsanız, herhangi bir karakterin önüne güvenle ters eğik çizgi koyabilirsiniz. Ancak, birçok harf ve sayının eğik çizgi ile birleştirildiğinde özel bir anlamı olduğunu unutmayın, bu nedenle tam anlamıyla aradığınız harf ve sayıların önüne bir \ gelmemelidir. Ters eğik çizgi karakterinin kendisini normal ifadeye dahil etmek için, açıkça önüne başka bir ters eğik çizgi karakteri koymanız gerekir. Örneğin, aşağıdaki normal ifade, ters eğik çizgi karakteri içeren herhangi bir dizeyle eşleşir: / \\ /.

Karakter sınıfları

Bireysel değişmez karakterler, köşeli parantez içine alınarak karakter sınıflarında birleştirilebilir. Bir karakter sınıfı, bu sınıfta yer alan herhangi bir karakterle eşleşir. Bu nedenle, normal ifade // a, b veya c karakterlerinden biriyle eşleşir.

Olumsuz karakter sınıfları, parantez içinde belirtilenler dışındaki herhangi bir karakterle eşleşecek şekilde de tanımlanabilir. Olumsuz bir karakter sınıfı, sol parantezden sonraki ilk karakter olarak ^ karakteriyle belirtilir. / [^ abc] / normal ifadesi, a, b veya c dışındaki herhangi bir karakterle eşleşir. Karakter sınıflarında, kısa çizgi kullanılarak bir dizi karakter belirtilebilir. Latin alfabesinin tüm küçük harf karakterleri // ifadesini kullanmak için aranır ve Latin karakter kümesindeki herhangi bir harf veya sayı // ifadesi kullanılarak bulunabilir.

Belirli karakter sınıfları özellikle sık kullanılır, bu nedenle JavaScript'teki normal ifade sözdizimi, bunları belirtmek için özel karakterler ve kaçış dizileri içerir. Örneğin, \ s boşluk, sekmeler ve herhangi bir Unicode boşluk karakteriyle eşleşir ve \ S, Unicode olmayan herhangi bir boşluk karakteriyle eşleşir.

Aşağıdaki tablo bu özel karakterleri ve karakter sınıflarının sözdizimini listeler. (Karakter sınıfı kaçış dizilerinden bazılarının yalnızca ASCII karakterleriyle eşleştiğini ve Unicode karakterlerini işleyecek şekilde genişletilmediğini unutmayın. Kendi Unicode karakter sınıflarınızı açıkça tanımlayabilirsiniz, örneğin, / [\ u0400- \ u04FF] / herhangi bir Kiril karakteriyle eşleşir. )

JavaScript normal ifade karakter sınıfları
Sembol Yazışma
[...] Parantez içindeki herhangi bir karakter
[^...] Parantez içinde listelenmeyen karakterlerden herhangi biri
. Yeni satır veya diğer Unicode dize sınırlayıcı dışındaki herhangi bir karakter
\ w Herhangi bir ASCII metin karakteri. Eşittir
\ B ASCII metin karakteri olmayan herhangi bir karakter. [^ a-zA-Z0-9_] ile eşdeğer
\ s Herhangi bir Unicode boşluk karakteri
\ S Unicode kümesindeki boşluk olmayan herhangi bir karakter. \ w ve \ S'nin aynı olmadığına dikkat edin
\ NS Herhangi bir ASCII rakamı. Eşittir
\ NS ASCII rakamları dışındaki herhangi bir karakter. [^ 0-9] ile eşdeğer
[\ B] Geri alma karakteri değişmezi

Sınıf özel karakterleri için kaçış dizilerinin köşeli parantez içine alınabileceğini unutmayın. \ s herhangi bir boşluk karakteriyle ve \ d herhangi bir rakamla eşleşir, bu nedenle / [\ s \ d] / herhangi bir boşluk karakteri veya rakamla eşleşir.

Tekrarlama

Şimdiye kadar elde edilen düzenli ifadelerin söz dizimi bilgisi ile iki basamaklı bir sayıyı / \ d \ d / veya dört basamaklı sayıları / \ d \ d \ d \ d / olarak tanımlayabiliriz, ancak yapamayız, çünkü örneğin, bir sayıyı, herhangi bir rakamı veya isteğe bağlı bir rakamın takip ettiği üç harften oluşan bir diziyi tanımlayın. Bu daha karmaşık desenler, belirli bir düzenli ifade öğesinin kaç kez tekrarlanabileceğini belirtmek için normal ifade sözdizimini kullanır.

Tekrarlama sembolleri her zaman uygulandıkları modeli takip eder. Bazı tekrar türleri oldukça sık kullanılır ve bu durumları belirtmek için özel semboller vardır. Örneğin, + önceki kalıbın bir veya daha fazla örneğiyle eşleşir. Aşağıdaki tablo, yineleme sözdiziminin bir özetini sağlar:

Aşağıdaki satırlarda bazı örnekler gösterilmektedir:

Var desen = / \ d (2,4) /; // İki ila dört basamaklı bir sayı kalıbıyla eşleşir = / \ w (3) \ d? /; // Tam olarak üç kelime karakteri ve isteğe bağlı bir rakam kalıbıyla eşleşir = / \ s + Java \ s + /; // "Java" kelimesini bir veya daha fazla boşlukla eşleştirir // ondan önce ve sonra desen = / [^ (] * /; // Açık parantez dışında sıfır veya daha fazla karakterle eşleşir

Tekrarlama karakterlerini * ve ? kullanırken dikkatli olun. Önlerinde belirtilen örüntünün yokluğuna ve dolayısıyla sembollerin yokluğuna karşılık gelebilirler. Örneğin, / a * / normal ifadesi, a karakterini içermediğinden "bbbb" dizesiyle eşleşir.

Tabloda listelenen tekrar karakterleri, normal ifadenin sonraki kısımlarını aramak için kullanılabilecek maksimum tekrar sayısına karşılık gelir. Bunun "açgözlü" bir tekrar olduğunu söylüyoruz. Tekrarı açgözlü olmayan bir şekilde uygulamak da mümkündür. Tekrarın sembolünden (veya sembollerinden) sonra bir soru işareti belirtmek yeterlidir: ??, + ?, *? hatta (1.5) ?.

Örneğin, / a + / normal ifadesi, a harfinin bir veya daha fazla örneğiyle eşleşir. "aaa" dizesine uygulandığında, üç harfle de eşleşir. Öte yandan, / a +? / ifadesi, a harfinin bir veya daha fazla örneğini eşleştirir ve mümkün olan en az sayıda karakteri seçer. Aynı satıra uygulanan bu desen yalnızca ilk harf a ile eşleşir.

"Güvenli olmayan" bir tekrarlama her zaman beklenen sonucu vermez. Bir veya daha fazla a karakteri ve ardından bir b karakteriyle eşleşen / a + b / kalıbını düşünün. "aab" dizesine uygulandığında, tüm dizeyle eşleşir.

Şimdi / a +? B /'nin "açgözlü olmayan" versiyonunu kontrol edelim. Öncesinde yalnızca bir a karakteri bulunan b karakteriyle eşleşmesi gerektiği düşünülebilir. Aynı dizeye uygulanırsa, "aab"ın tek a ve son b ile eşleşmesi beklenir. Bununla birlikte, gerçekte, "açgözlü" versiyonda olduğu gibi, tüm dizi bu modelle eşleşir. Buradaki nokta, bir eşleşmenin mümkün olduğu dizgedeki ilk konumu bularak bir düzenli ifade desen aramasının gerçekleştirilmesidir. Dizenin ilk karakterinden bir eşleşme mümkün olduğundan, sonraki karakterlerle başlayan daha kısa eşleşmeler dikkate bile alınmaz.

Alternatifler, gruplama ve bağlantılar

Normal ifade dilbilgisi, alternatifleri, alt ifadeleri gruplandırmayı ve önceki alt ifadelere referansları tanımlamak için özel karakterler içerir. Boru sembolü | alternatifleri ayırmaya yarar. Örneğin, / ab | cd | ef /, "ab" dizesiyle veya "cd" dizesiyle veya "ef" dizesiyle eşleşir ve / \ d (3) | (4) / kalıbı üç basamaktan biriyle eşleşir veya dört küçük harf ...

Bir eşleşme bulunana kadar alternatiflerin soldan sağa doğru işlendiğini unutmayın. Sol alternatifle bir eşleşme bulunursa, "daha iyi" bir eşleşme elde edilebilse bile sağdaki seçenek yok sayılır. Bu nedenle, / a | ab / kalıbı "ab" dizesine uygulandığında, yalnızca ilk karakterle eşleşir.

Parantezlerin düzenli ifadelerde birkaç anlamı vardır. Bunlardan biri, tek tek öğelerin tek bir alt ifadede gruplandırılmasıdır, böylece öğeler |, *, +,? ve diğerleri bir bütün olarak ele alınır. Örneğin, / java (script)? / "java" ve ardından isteğe bağlı "script" kelimesiyle eşleşir ve / (ab | cd) + | ef) / "ef" dizesiyle veya bir veya daha fazla tekrarıyla eşleşir "ab" veya "cd" dizelerinden aynı.

Düzenli ifadelerde parantezlerin başka bir kullanımı, bir kalıp içindeki alt kalıpları tanımlamaktır. Hedef dizede bir normal ifade eşleşmesi bulunduğunda, hedef dizenin herhangi bir parantezli alt modelle eşleşen kısmını çıkarabilirsiniz.

Bir veya daha fazla küçük harf ve ardından bir veya daha fazla sayı aramak istediğinizi varsayalım. Bunu yapmak için / + \ d + / desenini kullanabilirsiniz. Ancak her maçın sonunda sadece sayıları istediğimizi de varsayalım. Desenin bu kısmını parantez (/ + (\ d +) /) içine koyarsanız, bulduğumuz eşleşmelerden sayıları çıkarabilirsiniz. Bunun nasıl yapıldığı aşağıda açıklanacaktır.

Bununla bağlantılı olarak, aynı normal ifadenin önceki bölümündeki alt ifadelere başvurmanıza izin veren parantez içindeki alt ifadelerin başka bir kullanımıdır. Bu, \ karakterinden sonra bir veya daha fazla rakam belirtilerek gerçekleştirilir. Rakamlar, normal ifade içindeki parantez içindeki alt ifadenin konumunu belirtir. Örneğin, \ 1 birinci alt ifadeye, \ 3 ise üçüncü alt ifadeye karşılık gelir. Alt ifadelerin birbirinin içine yerleştirilebileceğini unutmayın, bu nedenle saymada sol parantezin konumu kullanılır. Örneğin, aşağıdaki normal ifadede, iç içe geçmiş bir alt ifade (cript) başvurusu \ 2 gibi görünür:

/ (ava (cript)?) \ sis \ s (eğlence \ w *) /

Önceki bir alt ifadeye yapılan bir referans, o alt ifadenin kalıbına değil, bu kalıpla eşleşen bulunan metne işaret eder. Bu nedenle, bir dizenin tam olarak aynı karakterleri içeren bölümlerini seçen bir kısıtlama uygulamak için bağlantılar kullanılabilir. Örneğin, aşağıdaki normal ifade, tek veya çift tırnak içinde sıfır veya daha fazla karakterle eşleşir. Ancak, açılış ve kapanış tekliflerinin birbiriyle eşleşmesi gerekmez (yani, her iki teklifin de tek veya çift olması):

/[""][^""]*[""]/

Böyle bir bağlantı aracılığıyla tırnak işaretlerinin eşleşmesini isteyebiliriz:

Burada \ 1 ilk alt ifadeyle eşleşir. Bu örnekte, bağlantı, kapanış tırnak işaretinin açılış tırnak işaretiyle eşleşmesi kısıtlamasını uygular. Bu normal ifade, çift tırnak içinde tek tırnaklara izin vermez ve bunun tersi de geçerlidir.

Düzenli bir ifadedeki öğeleri, bu öğelere numaralı bir başvuru oluşturmadan gruplamak da mümkündür. Öğeleri (ve) arasında basitçe gruplamak yerine, grubu (?: ile başlatın ve sonlandırın). Örneğin, aşağıdaki kalıbı düşünün:

/ (ava (?: cript)?) \ sis \ s (eğlence \ w *) /

Burada alt ifade (?: Cript) sadece gruplama için gereklidir, böylece tekrar karakteri? Gruba uygulanabilir. Bu değiştirilmiş parantezler bir bağlantı oluşturmaz, bu nedenle bu normal ifadede \ 2, kalıpla eşleşen metni ifade eder (fun \ w *).

Aşağıdaki tablo, normal ifadelerdeki alternatifleri, gruplandırmayı ve başvuru operatörlerini listeler:

Javascript seçimi, gruplandırma ve referans normal ifade karakterleri
Sembol Anlam
| Alternatif. Soldaki alt ifadeyle veya sağdaki alt ifadeyle eşleşir.
(...) Gruplandırma. Öğeleri *, +,?, | vesaire. Ayrıca sonraki bağlantılarda kullanılmak üzere bu gruba karşılık gelen sembolleri de hatırlar.
(?:...) Yalnızca gruplama. Öğeleri tek bir bütün halinde gruplandırır, ancak bu gruba karşılık gelen sembolleri hatırlamaz.
\ sayı Grubu sayı numarasıyla eşleştirirken bulunan aynı karakterleri eşleştirir. Gruplar (muhtemelen iç içe) parantez içindeki alt ifadelerdir. Grup numaraları, soldan sağa doğru sol parantezler sayılarak atanır. Sembollerle oluşturulan gruplar (?: Numaralandırılmaz.

Maç pozisyonunun belirtilmesi

Daha önce açıklandığı gibi, bir normal ifadenin birçok öğesi, dize başına bir karakterle eşleşir. Örneğin, \ s bir boşluk karakteriyle eşleşir. Diğer normal ifade öğeleri, karakterlerin kendisiyle değil, karakterler arasındaki konumlarla eşleşir. Örneğin, \ b bir sözcük sınırıyla eşleşir - \ w (ASCII metin karakteri) ve \ W (metin olmayan karakter) arasındaki sınır veya bir ASCII metin karakteri ile satırın başı veya sonu arasındaki sınır.

\ b gibi öğeler, bulunan dizede bulunması gereken herhangi bir karakteri tanımlamaz, ancak eşleşme için geçerli konumları tanımlar. Bu öğelere bazen regex bağlantı öğeleri denir, çünkü deseni dizedeki belirli bir konuma tuttururlar. Kullanılan en yaygın bağlantı elemanları, desenleri sırasıyla bir satırın başına ve sonuna bağlayan ^ ve $'dır.

Örneğin, "JavaScript" kelimesi kendi satırında / ^ JavaScript $ / normal ifadesi kullanılarak bulunabilir. Tek bir "Java" kelimesini bulmak için (ve örneğin "JavaScript" kelimesinde bir önek değil), kelimeden önce ve sonra boşluk gerektiren / \ sJava \ s / kalıbını kullanmayı deneyebilirsiniz.

Ancak bu çözüm iki sorunu ortaya çıkarmaktadır. İlk olarak, "Java" kelimesini yalnızca her iki tarafı boşluklarla çevriliyse bulur ve satırın başında veya sonunda bulamaz. İkincisi, bu model eşleştiğinde, onun tarafından döndürülen dizge, tam olarak istediğimiz gibi olmayan, baştaki ve sondaki boşlukları içerecektir. Bu nedenle, boşluk \ s ile eşleşen bir kalıp yerine, \ b kelime sınırlarıyla eşleşen bir kalıp (veya çapa) kullanacağız. Aşağıdaki ifade ortaya çıkacaktır: / \ bJava \ b /.

\ B bağlantı elemanı, sözcük sınırı olmayan bir konumla eşleşir. Yani, / \ Bcript / kalıbı "JavaScript" ve "postscript" kelimeleri ile eşleşecek ve "script" veya "Scripting" kelimeleri ile eşleşmeyecektir.

İsteğe bağlı düzenli ifadeler de bağlantı koşulları olarak kullanılabilir. Karakterler (? = And) arasına bir ifade koymak, onu sonraki karakterlere karşı ileriye dönük bir eşleşmeye dönüştürür ve bu karakterlerin belirtilen kalıpla eşleşmesini, ancak eşleşme dizesine dahil edilmemesini gerektirir.

Örneğin, ortak bir programlama dilinin adını iki nokta üst üste koyarak eşleştirmek için / ava (cript)? (? = \:) / ifadesini kullanabilirsiniz. Bu kalıp, "JavaScript: The Definitive Guide" dizesindeki "JavaScript" kelimesiyle eşleşir, ancak ardından iki nokta üst üste gelmediği için "Java in a Nutshell" dizesindeki "Java" kelimesiyle eşleşmez.

(?!, Koşulunu girerseniz, sonraki karakterler için aşağıdaki karakterlerin belirtilen kalıpla eşleşmemesini gerektiren olumsuz bir görünüm olacaktır. Örneğin, kalıp / Java (?! Script) (\ w *) / "Java" alt dizesiyle, ardından bir büyük harf ve herhangi bir sayıda ASCII metin karakteriyle eşleşir, ancak "Java" alt dizesinin ardından "Script" alt dizesi gelmemesi koşuluyla, "JavaBeans" dizesiyle eşleşir, ancak dizeyle eşleşmez. “Javanese”, “JavaScrip” " dizesiyle eşleşir, Ancak" JavaScript "veya" JavaScripter " dizeleriyle eşleşmez.

Aşağıdaki tablo, normal ifade bağlantı karakterlerini listeler:

Normal İfade Bağlantı Karakterleri
Sembol Anlam
^ Çok satırlı bir aramada bir dize ifadesinin başlangıcıyla veya bir dizenin başlangıcıyla eşleşir.
$ Çok satırlı bir aramada bir dize ifadesinin sonuyla veya bir dizenin sonuyla eşleşir.
\ B Bir kelime sınırına karşılık gelir, yani. \w karakteri ile \W karakteri arasındaki veya \w karakteri ile bir dizenin başı veya sonu arasındaki konumla eşleşir. (Ancak, [\ b] öğesinin geri al karakteriyle eşleştiğine dikkat edin.)
\ B Sözcük sınırı olmayan bir konumla eşleşir.
(? = p) Sonraki karakterler için olumlu bir ileriye dönük kontrol. p ile eşleşmesi için sonraki karakterleri gerektirir, ancak bu karakterleri bulunan dizeye dahil etmez.
(?! P) Sonraki karakterler için negatif ileriye dönük kontrol. Aşağıdaki karakterlerin p ile eşleşmemesini gerektirir.

Bayraklar

Ve bir tane daha, düzenli ifade dilbilgisinin son öğesi. Normal ifade bayrakları, üst düzey desen eşleştirme kurallarını belirtir. Normal ifade dilbilgisinin geri kalanından farklı olarak, bayraklar eğik çizgi karakterleri arasında değil, ikincisinden sonra belirtilir. JavaScript'te desteklenen üç bayrak vardır.

i'yi işaretle desen eşleştirmenin büyük/küçük harfe duyarlı olmaması 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 arar. Aranan dize ifadesi satır besleme karakterleri 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 dizesinin başlangıcı ve bitişiyle de eşleşir. Örneğin, / java $ / im hem "java" hem de "Java\nis fun" ile eşleşir.

Bu bayraklar herhangi bir kombinasyonda birleştirilebilir. Örneğin, "java" (veya "Java", "JAVA" vb.) kelimesinin ilk geçtiği yeri büyük/küçük harfe duyarsız bir şekilde aramak için, büyük/küçük harfe duyarlı olmayan normal ifadeyi / \ bjava \ b / kullanabilirsiniz. ben. Ve bir dizgede bu kelimenin tüm oluşumlarını bulmak için g: / \ bjava \ b / gi bayrağını ekleyebilirsiniz.

Desen eşleştirme için dize sınıfı yöntemleri

Bu noktaya kadar, oluşturulan normal ifadenin gramerini tartıştık, ancak normal ifadenin JavaScript'te gerçekte nasıl kullanılabileceğine bakmadık. Bu bölümde, kalıp eşleştirme ve arama ve değiştirme için düzenli ifadeler kullanan String nesnesinin yöntemlerini tartışacağız. Ardından, RegExp nesnesine ve yöntemlerine ve özelliklerine bakarak, düzenli ifadelerle kalıp eşleştirme tartışmamıza devam edeceğiz.

Dizeler, normal ifadeler kullanan dört yöntemi destekler. Bunlardan en basiti yöntem arama ()... Argüman olarak normal bir ifade alır ve bulunan alt dizenin ilk karakterinin konumunu veya eşleşme bulunamazsa -1 değerini döndürür. Örneğin, aşağıdaki çağrı 4 döndürür:

Var sonuç = "JavaScript" .search (/ script / i); // 4

search() yönteminin 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 bağımsız değişkeninde g bayrağını yok sayar.

Yöntem yer değiştirmek () 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 desenle eşleşmesi için çağrıldığı satırı arar.

Normal ifade g bayrağını içeriyorsa, replace() yöntemi bulduğu tüm eşleşmeleri değiştirme dizesiyle değiştirir. Aksi takdirde, yalnızca bulduğu ilk eşleşmeyi değiştirir. replace() yönteminin ilk argümanı bir dizgeyse ve normal bir ifade değilse, bu durumda yöntem, arama () olarak RegExp () yapıcısını kullanarak onu normal bir ifadeye dönüştürmek yerine dizge için değişmez bir arama gerçekleştirir. yöntem yapar.

Örnek olarak, bir metin satırının tamamı için "JavaScript" kelimesini tutarlı bir şekilde büyük harf yapmak için replace() yöntemini kullanabiliriz:

// Büyük/küçük harfe bakılmaksızın, gereken durumda bir kelime ile değiştirin var sonuç = "javascript" .replace (/ JavaScript / ig, "JavaScript");

replace() yöntemi, bu örneğin önerebileceğinden daha güçlüdür. Bir normal ifadenin içindeki parantez içindeki alt ifadelerin soldan sağa doğru numaralandırıldığını ve normal ifadenin her bir alt ifadeyle eşleşen metni hatırladığını hatırlatmama izin verin. Değiştirilen dize bir $ ve ardından bir rakam içeriyorsa, replace() yöntemi bu iki karakteri belirtilen alt ifadeyle eşleşen metinle değiştirir. Bu çok kullanışlı bir özellik. Örneğin, bir dizedeki düz tırnakları ASCII karakterleriyle simüle edilen tipografik tırnaklarla değiştirmek için kullanabiliriz:

// Alıntı bir alıntıdır, ardından herhangi bir sayıda alıntı olmayan karakter gelir (bunları hatırlıyoruz), // bu karakterlerin ardından başka bir alıntı var alıntı = / "([^"] *) "/ g; // Düz tırnakları tipografik olanlarla değiştirin ve "$ 1" ifadesini değiştirmeden bırakın // $ 1'de saklanan alıntı içeriği var text = "" JavaScript "yorumlanmış bir programlama dilidir."; Var sonuç = text.replace (quote, " " $ 1 "") ; // "JavaScript" yorumlanmış bir programlama dilidir.

Unutulmaması gereken önemli bir nokta, değiştirilecek () ikinci argümanın, değiştirme dizesini dinamik olarak hesaplayan bir işlev olabileceğidir.

Yöntem kibrit () String sınıfının düzenli ifade yöntemlerinden en yaygın olanıdır. 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 dizedeki 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 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. Bu nedenle, eşleşme () bir arr dizisi döndürürse, arr bulunan dizenin tamamını içerecek, arr ilk alt ifadeyle eşleşen alt dizeyi içerecek ve bu böyle devam edecektir. replace() yöntemine paralel olarak arr [n]'nin $ n içeriğiyle dolu olduğunu söyleyebiliriz.

Örneğin, bir URL'yi ayrıştırmak için aşağıdaki koda bakın:

Var url = /(\w+):\/\/((\w.tory+)\/(\S*)/; var text = "http://www..php sitemizi ziyaret edin"; var sonuç = text.match (url); if (sonuç! = null) (var fullurl = sonuç; // "http: //www..php" içerir var protokol = sonuç; // "http" içerir var ana bilgisayar = sonuç; // "www..php içerir ")

g global arama bayrağı ayarlanmamış bir normal ifade için, match () yönteminin, normal ifadenin exec () yöntemiyle aynı değeri döndürdüğüne dikkat edilmelidir: döndürülen dizi, indeks ve girdi özelliklerine sahiptir. aşağıdaki exec ( ) tartışmasında açıklanmıştır.

Düzenli ifadeler kullanan String nesnesinin yöntemlerinin sonuncusu şudur: bölmek ()... Bu yöntem, bağımsız değişkeni sınırlayıcı olarak 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, argüman olarak düzenli bir ifade de alabilir. Bu, yöntemi daha güçlü hale getirir. Örneğin, her iki tarafta da rastgele sayıda boşluk karakterine izin veren bir sınırlayıcı belirtebilirsiniz:

"1, 2, 3, 4, 5" .split (/ \ s *, \ s * /); // ["1", "2", "3", "4", "5"] döndürür

Normal İfade nesnesi

Belirtildiği gibi, normal ifadeler RegExp nesneleri olarak temsil edilir. RegExp () yapıcısına ek olarak, RegExp nesneleri üç yöntemi ve birkaç özelliği destekler.

RegExp () yapıcısı bir veya iki dize argümanı alır ve yeni bir RegExp nesnesi oluşturur. Yapıcının ilk argümanı, normal ifadenin gövdesini içeren bir dizedir, yani. regex değişmezinde eğik çizgi karakterleri arasında görünmesi gereken metin. Dize değişmezlerinin ve normal ifadelerin kaçış dizilerini belirtmek için \ karakterini kullandığını unutmayın, bu nedenle normal ifadeyi bir dize değişmezi olarak RegExp () yapıcısına iletirken, her bir \ karakterini bir çift \\ karakteriyle değiştirmeniz gerekir.

RegExp() işlevinin ikinci argümanı eksik olabilir. Belirtilirse, normal ifadenin bayraklarını tanımlar. g, i, m karakterlerinden biri veya bu karakterlerin bir kombinasyonu olmalıdır. Örneğin:

// Bir dizgedeki tüm 5 basamaklı sayıları bulur. Not // \\ var zipcode kullanımı = new RegExp ("\\ d (5)", "g");

RegExp () yapıcısı, normal ifade dinamik olarak oluşturulduğunda ve bu nedenle normal ifade değişmez sözdizimi kullanılarak temsil edilemediğinde kullanışlıdır. Örneğin, kullanıcı tarafından girilen bir dizeyi bulmak için, çalışma zamanında RegExp () kullanarak normal bir ifade oluşturursunuz.

Normalİfade Özellikleri

Her RegExp nesnesinin beş özelliği vardır. Mülk kaynak- normal ifadenin metnini içeren salt okunur bir dize. Mülk küresel- normal ifadede g bayrağının varlığını belirleyen salt okunur bir boole değeri. Mülk yok saymak i bayrağının normal ifadede bulunup bulunmadığını belirleyen salt okunur bir boole değeridir. Mülk çok satırlı normal ifadede m bayrağının varlığını belirten salt okunur bir boole değeridir. Ve son mülk lastIndex bir okuma/yazma tamsayıdır. g bayrağına sahip desenler için bu özellik, bir sonraki aramanın başlaması gereken dizideki konum numarasını içerir. Aşağıda açıklandığı gibi, exec () ve test () yöntemleri tarafından kullanılır.

Normal İfade yöntemleri

RegExp nesneleri, desen eşleştirme gerçekleştiren iki yöntemi tanımlar; yukarıda açıklanan String sınıfının yöntemlerine benzer şekilde davranırlar. Kalıp eşleştirme için kullanılan RegExp sınıfının ana yöntemi şudur: yürütme ()... Argüman olarak bir dize alan RegExp sınıfının bir yöntemi olması ve String sınıfının bir RegExp argümanı alan bir yöntemi olmaması dışında, String sınıfının daha önce bahsedilen match() yöntemine benzer.

exec () yöntemi, belirtilen dizede normal bir ifade yürütür, yani. bir dizede bir eşleşme arar. Eşleşme bulunamazsa, yöntem null değerini döndürür. Ancak, bir eşleşme bulunursa, g bayrağı olmadan arama yapmak için match() yöntemi tarafından döndürülen diziyle aynı diziyi döndürür. 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. Ayrıca, mülk dizin karşılık gelen parçanın başladığı karakterin konum numarasını ve özelliği içerir giriş aranan diziyi ifade eder.

Match ()'den farklı olarak, exec () yöntemi, yapısı normal ifadede g bayrağının varlığına bağlı olmayan bir dizi döndürür. Genel bir normal ifadeyi geçerken, match () yönteminin bulunan bir eşleşme dizisini döndürdüğünü hatırlatmama izin verin. Ve exec () her zaman bir eşleşme döndürür, ancak bununla ilgili tam bilgi sağlar. g bayrağını içeren bir normal ifadede exec() çağrıldığında, yöntem, normal ifade nesnesinin lastIndex özelliğini, bulunan alt dizeden hemen sonraki karakterin konum numarasına ayarlar.

Aynı normal ifade için exec () yöntemi ikinci kez çağrıldığında, konumu lastIndex özelliğinde belirtilen karakterde aramaya başlar. exec () bir eşleşme bulamazsa, lastIndex özelliği 0'a ayarlanır. (Aynı satırdaki son eşleşmeden önce aramanın tamamlandığı tüm durumlarda yapılması gereken, herhangi bir zamanda lastIndex'i sıfıra ayarlayabilirsiniz. bulundu ve aynı RegExp nesnesi ile başka bir dizge üzerinde bir arama başlatır.) Bu özel davranış, dizgedeki tüm normal ifade eşleşmelerini yinelemek için exec () öğesinin tekrar tekrar çağrılmasına izin verir. Örneğin:

Var desen = / Java / g; var text = "JavaScript, Java'dan daha komik!"; var sonuç; while ((sonuç = pattern.exec (metin))! = null) (console.log ("Bulundu" "+ sonuç +" "" + "konumda" + sonuç.index + "; sonraki arama " ile başlayacak" + desen .lastIndex);)

RegExp nesnesinin başka bir yöntemi - Ölçek () exec () yönteminden çok daha basittir. Bir dize alır ve dize normal bir ifadeyle eşleşirse true değerini döndürür:

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

test() öğesinin çağrılması, exec() öğesinin çağrılmasına eşdeğerdir, exec() öğesinin boş olmaması durumunda true öğesinin döndürülmesi. Bu nedenle test() yöntemi, global bir düzenli ifade için çağrıldığında exec() yöntemiyle aynı şekilde davranır: lastIndex özelliği tarafından verilen konumda belirtilen dizeyi aramaya başlar ve bir eşleşme bulursa, ayarlar lastIndex özelliği, doğrudan bulunan eşleşmenin yanında, karakter konum numarasına. Bu nedenle, test() yöntemini kullanarak, exec() yöntemini kullanırken olduğu gibi bir çizgiyi geçmek için de bir döngü oluşturabilirsiniz.

Normal ifadeler veya normal ifadeler yeni başlayanlar için göz korkutucudur, ancak herhangi bir programcı için gereklidir. 5 basit JavaScript örneği ile düzenli ifadeleri parçalayalım.

Bir sorununuz varsa ve düzenli ifadelerle çözecekseniz, artık iki sorununuz var. Bir söz vardır. Kodlarda bulunan düzenli ifadeler, bazen onlara aşina olmayan insanlarda korku ve nefrete neden olur.

Ama aslında, herhangi bir normal ifade, yalnızca bir satırda tüm bir işlevin problemini çözebilen bir şablon ifadesidir. Bununla birlikte, düzenli bir ifade oluşturmak, yeni başlayanların kafasının karışabileceği ve yanılabileceği bir dizi katı kural gerektirir.

eşleşen karakterler

En temel normal ifadeler, her seferinde bir karakterle eşleşenlerdir. İşte kuralları:

1. Nokta (.) Herhangi bir karakterle eşleşir. Tam olarak bir noktayı aramanız gerekiyorsa, "\" (\.) karakteriyle kaçılmalıdır.

2. Bir soru işareti (?) Bir önceki karakterin isteğe bağlı olduğunu belirtir. Bir dizgede soru işaretinin kendisini aramak için, "\" (\?) ile de kaçılmalıdır.

var text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit lest. Donec convallis dignissim ligula, et rutrum est elat vistibulum eu."; // Hem "elit" hem de "elat" çalışacaktır. Dönem, herhangi bir karakterin yapacağı anlamına gelir. var normal ifade = /el.t/g; konsol.log (metin.eşleştirme (normal ifade)); // "est" ve "lest" eşit derecede iyi çalışacaktır. Soru işareti "l"yi isteğe bağlı yapar. var regex2 = / l?est / g; konsol.log (metin.eşleştirme (regex2));

var metin = "Lorem ipsum dolor sit amet, consectetur adipiscing elit lest. Donec convallis dignissim ligula, et rutrum est elat vistibulum eu.";

// Hem "elit" hem de "elat" çalışacaktır. Dönem, herhangi bir karakterin yapacağı anlamına gelir.

var normal ifade = /el.t/g;

konsol. günlük (metin. eşleşme (normal ifade));

// "est" ve "lest" eşit derecede iyi çalışacaktır. Soru işareti "l"yi isteğe bağlı yapar.

var regex2 = / l?est / g;

konsol. günlük (metin. eşleşme (regex2));

Birden çok karakter eşleştirme

Bir küme, örneğin parantez içine alınmış bir veya daha fazla karakterdir. Böyle bir ifade, dizeyi yalnızca bu karakter kümesi için arayacaktır - bu örnekte yalnızca a, b veya c. Tersine, "^" karakterini kullanmak dışında herhangi bir karakterin oluşumunu arayabilirsiniz. [^ abc], a, b veya c olmayan herhangi bir karakterle eşleşir. Gibi bir dizi karakter veya sayı da belirtebilirsiniz.

Normal ifadeler yazmayı kolaylaştıran yerleşik karakter kümeleri vardır. Bunlara kesikler veya steno denir. Örneğin, yerine \ D yazabilirsiniz. Diğer karakterler için (sayılar ve alt çizgiler dahil) - \ w ve \ W ile boşluklar - \ s ve \ S için kısaltmalar vardır.

// "araba" değil, yalnızca "kedi" ve "can" çalışır. var text = "kedi arabası"; konsol.log (text.match (/ ca / ​​​​g)); // cat ve can (bir ^ karakteri var) hariç her şeyi iletecek console.log (text.match (/ ca [^ tn] / g)); // Sadece sayıların geçeceği başka bir örnek text = "8 fincan kahve istiyorum lütfen."; konsol.log ("Kaç bardak:" + text.match (// g)); // \ d kısayol konsol.log ile daha kolay yol ("Kaç bardak:" + text.match (/ \ d / g)); // Console.log (text.match (/ \ D / g) sayıları hariç her şeyi iletir);

// "araba" değil, yalnızca "kedi" ve "can" çalışır.

var text = "kedi arabası";

konsol. günlük (metin. eşleşme (/ ca / ​​​​g));

// cat ve can (^ mevcut) hariç her şeyi geçecek

konsol. log (metin. eşleşme (/ ca [^ tn] / g));

// Yalnızca sayıların geçeceği başka bir örnek

metin = "8 fincan kahve istiyorum, lütfen.";

konsol. log ("Kaç bardak:" + metin. maç (// g));

// \ d kısayoluyla daha kolay yol

konsol. log ("Kaç bardak:" + metin. maç (/ \ d / g));

// Sayılar hariç her şeyi geçecek

konsol. günlük (metin. eşleşme (/ \ D / g));

eşleşen kelimeler

Çoğu durumda, tek tek karakterleri değil, tüm kelimeleri aramanız gerekir. Bu, bir karakteri veya karakter kümesini tekrar eden (+) ve (-) değiştiricileri ile yapılır.

Toplama (X) tam tekrar sayısını belirtir, (x, y) aralıktır (x ve y sayılardır).

Ek olarak, kelime sonu sınırlarına uyan özel bir kalıp \ b vardır.

var text = "Merhaba 1974'ün insanları. Ben gelecekten geliyorum. 2014'te lazer silahlarımız, uçan tahtalarımız var ve ayda yaşıyoruz!"; // Yılları bul. \ d + bir veya daha fazla karakterle eşleşir var yearRegex = / \ d + / g; konsol.log ("Yıllar:", text.match (yearRegex)); // Tüm teklifleri bul. Cümlelerimiz büyük harfle başlar ve nokta veya ünlem işareti ile biter. var cümleRegex = /.+?(\.|!)/g; konsol.log ("Cümleler:", text.match (sentenceRegex)); // "h" ile başlayan tüm kelimeleri bulur. Hem büyük hem de küçük harf iyidir, bu nedenle bir kelime sınırı tanımlamak için i // \ b değiştiricisini kullanırız. var hWords = / \ bh \ w + / ig; konsol.log ("H Words:", text.match (hWords)); // 4 ile 6 karakter arasındaki tüm kelimeleri bul var findWords = / \ b \ w (4,6) \ b / g; konsol.log ("4 ila 6 karakter arasındaki kelimeler:", text.match (findWords)); // 5 karakterden uzun kelimeleri bulun console.log ("5 karakter veya daha uzun kelimeler:", text.match (/ \ b \ w (5,) \ b / g)); // Tam olarak 6 karakter uzunluğundaki kelimeleri bulun konsol.log ("Tam olarak 6 karakter uzunluğundaki kelimeler:", text.match (/ \ b \ w (6) \ b / g));

var metin = "Merhaba 1974'ün insanları. Ben gelecekten geliyorum. 2014'te lazer silahlarımız, uçan tahtalarımız var ve ayda yaşıyoruz!";

// Yılları bul. \ d + bir veya daha fazla karakterle eşleşir

var yılRegex = / \ d + / g;

konsol. log ("Yıllar:", metin. eşleşme (yılRegex));

// Tüm teklifleri bul. Cümlelerimiz büyük harfle başlar ve nokta veya ünlem işareti ile biter.

var cümleRegex = /.+?(\.|!)/g;

konsol. log ("Cümleler:", metin. eşleşme (sentenceRegex));

// "h" ile başlayan tüm kelimeleri bulur. Hem büyük hem de küçük harf iyidir, bu nedenle i değiştiricisini kullanın

// \ b Kelime sınırlarını tanımlamak için.

var hWords = / \ bh \ w + / ben g;

konsol. log ("H Words:", metin. eşleşme (hWords));

// 4 ile 6 karakter arasındaki tüm kelimeleri bul

var findWords = / \ b \ w (4,6) \ b / g;

konsol. kayıt ( "4 ila 6 karakter arasındaki kelimeler:", Metin. eşleştir (kelimeleri bul));

// 5 karakterden uzun kelimeleri bul

konsol. günlük ("Kelimeler 5 karakter veya daha uzun:", metin. eşleşme (/ \ b \ w (5,) \ b / g));

// Tam olarak 6 karakter uzunluğundaki kelimeleri bul

konsol. kayıt ( "Kelimeler tam olarak 6 karakter uzunluğunda:", Metin. eşleşme (/ \ b \ w (6) \ b / g));

Tüm dizeleri doğrulama

JavaScript'te, bu tür ifadeler, metin alanlarından kullanıcı girişini doğrulamak için kullanılabilir. Dizeleri doğrulamak için, bir metin parçasının başına ve sonuna eklenen, bu ifade için ^ (satır başı) ve $ (satır sonu) kullanılarak normal bir normal ifade kullanılır. Bu karakterler, yazdığınız kalıbın metnin yalnızca bir kısmıyla eşleşmesini değil, metnin tüm uzunluğunu kapsamasını sağlar.

Ayrıca, bu durumda, normal ifadenin dizeyle eşleşip eşleşmediğini kontrol ederken doğru veya yanlış döndüren regex nesnesinin test () yöntemini kullanırız.

// Bir dizi dizimiz var, hadi bağlantıları bulalım..com / "," 123461 "," https: // site /? S = google "," http: // geçerli bir url değil "," abc http: / /invalid.url/ "]; var regex = /^https?:\/\/ [\w\/?.&-=^+$/; var urls =; for (var i = 0; i< strings.length; i++){ if(regex.test(strings[i])){ // Валидная ссылка urls.push(strings[i]); } } console.log("Valid URLs: ", urls);

// Bir dizi dizimiz var, bağlantıları bulalım.

var dizeleri = [

"https: // site /",

"bu bir URL değil",

"https://google.com/",

"123461" ,

"https: // site /? s = google",

"http://geçerli bir url değil",

"abc http: //geçersiz.url/"

var normal ifade = / ^ https? : \ / \ / [\ w \ /? ... & - =] + $ /;

var url =;

for (var i = 0; i< strings . length ; i ++ ) {

if (normal ifade. test (dizeler [i])) (

url'ler. push (dizeler [i]);

konsol. log ("Geçerli URL'ler:", url'ler);

Bul ve Değiştir

Normal ifadelerin kullanımıyla kolaylaştırılan diğer bir ortak görev, metni bulmak ve değiştirmektir.

Bu makale Javascript'te normal ifade kullanmanın temellerini ele almıştır.

Tanıtım

Düzenli ifade nedir?

Bir JS normal ifadesi, bir arama kuralı oluşturan bir karakter dizisidir. Bu kural daha sonra metni aramak ve değiştirmek için kullanılabilir. Pratikte, düzenli bir ifade tek bir karakterden bile oluşabilir, ancak daha karmaşık arama kalıpları daha yaygındır.

Javascript'te normal ifadeler de nesnelerdir. Bunlar, dizilerdeki karakter dizilerini eşleştirmek için kullanılan kalıplardır. RegExp nesnesinin exec () ve test () yöntemlerinde ve ayrıca String nesnesinin match (), replace (), search ve split () yöntemlerinde kullanılırlar.

Örnek

var desen = / örnek / i

/ örnek / i bir normal ifadedir. örnek bir şablondur ( aramada kullanılacak). i, büyük/küçük harf duyarlılığını gösteren bir değiştiricidir.

Normal ifade hazırlama

JS düzenli ifadeleri bir kalıp ve bir değiştiriciden oluşur. Sözdizimi şöyle bir şey olacaktır:

/ desen / değiştiriciler;

Şablon, arama kuralını tanımlar. / abc / gibi basit karakterlerden veya basit ve özel karakterlerin bir kombinasyonundan oluşur: / abc / veya / Bölüm (d +).D /.

Şablon tablosu

Değiştiriciler, sorguların büyük/küçük harf duyarlı, genel vb. olmasına izin verir. Genel aramaların yanı sıra büyük/küçük harfe duyarlı aramalar yapmak için kullanılırlar.

değiştirici tablo


Artık JS düzenli ifadelerini uygulamaya hazırız. Bunu yapmanın iki ana yolu vardır: dize için bir normal ifade nesnesi veya bir normal ifade kullanmak.

Normal ifade nesnesi kullanma

Normal bir ifade nesnesi oluşturun

Bu nesne bir karakter desenini tanımlar. Desen eşleştirme için kullanılır. Normal ifade nesnesi oluşturmanın iki yolu vardır.

Yöntem 1: Eğik çizgi içine alınmış bir desenden oluşan bir regex değişmezi kullanmak, örneğin:

var reg = / ab + c /;

Normal ifade değişmezleri, komut dosyası ayrıştırıldığında normal ifadenin önceden derlenmesini tetikler. Normal ifade kalıcıysa, performansı artırmak için kullanın.

Yöntem 2: RegExp nesnesinin yapıcı işlevini çağırarak, örneğin:

var reg = new RegExp ("ab + c");

Yapıcıyı kullanmak, JS normal ifadesini çalışma zamanında derlemenize olanak tanır. Normal ifade değişecekse veya kalıbı önceden bilmiyorsanız bu yöntemi kullanın. Örneğin, bir arama terimi giren bir kullanıcıdan bilgi alırsanız.

Normal İfade Nesnesi Yöntemleri

Normal ifade nesnesinin birkaç yaygın yöntemine bir göz atalım:

  • derleme () ( 1.5 sürümünde kullanımdan kaldırıldı) - düzenli bir ifade derler;
  • exec () - Bir dizgede eşleştirme gerçekleştirir. İlk eşleşmeyi döndürür;
  • test () - Bir dizgede eşleştirme gerçekleştirir. true veya false döndürür;
  • toString () - Normal ifadenin dize değerini döndürür.

Örnekleri

testi kullanma ()

test() yöntemi, bir RegExp nesnesinin normal ifadesidir. Bir kalıp dizesi arar ve döndürdüğü sonuca bağlı olarak doğru veya yanlış döndürür. Aşağıdaki JS normal ifade örneği, " karakteri için bir dizede nasıl arama yapılacağını gösterir. e”:

var patt = / e /; patt.test ("Dünyanın en iyi şeyleri bedava!");

Burada satır içerdiğinden beri “ e”, Bu kodun sonucu doğru olacaktır.

Bir değişkene düzenli ifadeler koymanız gerekmez. Aynı sorgu tek satırda yapılabilir:

/e/.test("Dünyanın en iyi şeyleri bedava!");

exec () kullanma

Belirtilen arama kuralı için dizeyi arar ve bulunan metni döndürür. Eşleşme bulunamazsa, sonuç null olur.

Aynı sembol örneğini kullanarak yöntemi çalışırken görelim “ e”:

/e/.exec("Dünyanın en iyi şeyleri bedavadır!");

Satır içerdiğinden beri “ e”, Bu kodun sonucu .e olacaktır.

Bir dizeye normal ifade uygulama

Javascript'te bu ifadeler, String nesnesinin iki yöntemiyle de kullanılabilir: search() ve replace(). Metinde arama yapmak ve değiştirmek için gereklidirler.

  • search() yöntemi - bir eşleşme bulmak için bir ifade kullanır ve eşleşmenin yeri hakkında bilgi verir;
  • Değiştir () yöntemi - değiştirilmiş bir şablonla değiştirilmiş bir dize döndürür.

Örnekleri

"" ifadesi için Büyük/Küçük Harfe Duyarlı Arama Gerçekleştirmek için JS Normal İfadesinin Uygulanması w3okulları" Çizgide:

var str = "W3Schools'u Ziyaret Edin"; var n = str.search (/ w3schools / i);

n cinsinden sonuç 6'dır.

Arama yöntemi ayrıca bir dizeyi argüman olarak kabul eder. Dize argümanı normal bir ifadeye dönüştürülecektir:

“İfadesini bulmak için dizeyi kullanma W3okulları" Çizgide:

var str = "W3Schools'u Ziyaret Edin!"; var n = str.search ("W3Schools");

Değiştirmek için büyük/küçük harfe duyarlı bir JS normal ifadesi uygulanıyor " Microsoft" üzerinde " W3Okulları" Çizgide:

var str = "Microsoft'u ziyaret edin!"; var res = str.replace (/ microsoft / i, "W3Schools");

Sonuç olarak şunları elde ederiz: “W3Schools'u ziyaret edin! ".

replace () yöntemi ayrıca bir arama dizesini de kabul eder:

var str = “Microsoft'u Ziyaret Edin!”; var res = str.replace (“Microsoft”, “W3Schools”);

Yazının tercümesi “ Javascript'te normal ifade kullanma”Güleryüzlü proje ekibi tarafından hazırlanmıştır.

Normal ifade sözdizimi oldukça karmaşıktır ve öğrenmek için çok çaba gerektirir. Bugün düzenli ifade için en iyi rehber, yazara göre "düzenli ifadelerde düşünmeyi öğrenmeyi" sağlayan J. Friedl'in "Normal İfadeler" kitabıdır.

Temel konseptler

Düzenli ifade- bir metin desenini tanımlayan karakter dizilerini veya dizileri işlemek için bir araç.

değiştirici- düzenli bir ifadeyi "eğitmek" için tasarlanmıştır.

meta karakterler- normal ifade dilinde komut görevi gören özel karakterler.

Normal ifade sıradan bir değişken olarak belirtilir, tırnak işaretleri yerine yalnızca eğik çizgi kullanılır, Örneğin: var reg = / reg_expression /

En basit şablonlar ile, herhangi bir özel karakter gerektirmeyen bu tür şablonları kastediyoruz.

Diyelim ki görevimiz bir cümledeki tüm "p" harflerini (küçük ve büyük) Latince büyük harf "R" ile değiştirmek. Düzenli ifadeler.

Şablon oluştur var reg = / p / ve yöntemi kullanarak yer değiştirmek planlarımızı uyguluyoruz

Sonuç olarak, çizgiyi alıyoruz - Düzenli ifadeler, değiştirme yalnızca büyük/küçük harfe duyarlı "p" harfinin ilk geçtiği yerde gerçekleşti.

Ama bu sonuç bizim görevimizin şartlarına uymuyor... İşte ihtiyacımız olan şey değiştiriciler Ayrı ayrı veya birlikte kullanılabilen "g" ve "i". Bu değiştiriciler, eğik çizgiden sonra normal ifade modelinin sonuna yerleştirilir ve aşağıdaki anlamlara sahiptir:

değiştirici"g" - dizideki aramayı "global" olarak belirtir, yani bizim durumumuzda, "p" harfinin tüm oluşumları için değiştirme gerçekleşecektir. Şablon şimdi şöyle görünür: var reg = / p / g kodumuzun içine koyarak

çizgiyi alıyoruz - Düzenli ifadeler.

değiştirici "i"- bu değiştiriciyi şablonumuza ekleyerek bir dizede büyük/küçük harfe duyarsız bir arama belirtir var reg = / p / gi, betiği çalıştırdıktan sonra, görevimizin istenen sonucunu alıyoruz - DÜZENLİ İFADELER.

Özel karakterler (meta karakterler)

Meta karakterler, arama dizisinin karakterlerinin türünü, arama dizisinin metin içinde çevrelenme şeklini ve taranan metindeki belirli bir türdeki karakter sayısını belirtir. Bu nedenle, meta karakterler üç gruba ayrılabilir:

  • Meta karakterleri arayın.
  • Nicel meta karakterler.
  • Konumlandırma meta karakterleri.

Meta karakterleri eşleştir

Anlam

Açıklama

kelime sınırı

kalıbın bir kelimenin başında veya sonunda yürütülmesi gereken koşulu belirtir

/ \ ber / ile çakışır hata, eşleşmiyor kahraman veya ile oyuncu
/ ee / ile çakışır oyuncu, eşleşmiyor kahraman veya ile hata
/ \ ber \ b / eşleşmiyor kahraman veya ile oyuncu veya ile hata, sadece ile eşleşebilir er

kelime sınırı değil

kalıbın bir kelimenin başında veya sonunda yürütülmediği bir koşulu belirtir

/ \ Bir / ile çakışır kahraman veya ile oyuncu, eşleşmiyor hata
/ er \ B / ile çakışır hata veya ile oyuncu, eşleşmiyor kahraman
/ \ Ber \ B / ile çakışır kahraman, eşleşmiyor oyuncu veya ile hata

0'dan 9'a kadar bir rakam

/ \ d \ d \ d \ d / herhangi bir dört basamaklı sayıyla eşleşir

/ \ D \ D \ D \ D / eşleşmeyecek 2005 veya 05.y veya №126 vesaire.

tek boş karakter

boşluk karakteriyle eşleşir

\ üzerinde \ bayt \ sadece eşleşir bayt üzerinde

tek boş olmayan karakter

boşluk dışında herhangi bir karakter

\ üzerinde \ Sbyte \ ile çakışır aşırı bayt veya ile over_byte, eşleşmiyor bayt üzerinde veya fazla bayt

harf, sayı veya alt çizgi

/ A \ w / ile çakışır A1 veya ile AB, eşleşmiyor bir +

harf, sayı veya alt çizgi değil

/ A \ W / eşleşmiyor A1 veya ile AB, denk gelir bir +

herhangi bir karakter

herhangi bir işaret, harf, rakam vb.

/.../ herhangi üç karakterle eşleşir ABC veya [e-posta korumalı] veya 1 q

karakter seti

köşeli parantez içine alınmış herhangi bir karakter eşleşmesi için kalıbın yürütüleceği koşulu belirtir

/ WERTY / ile çakışır QWERTY, ile birlikte MUHTEŞEM

dahil olmayan bir dizi karakter

köşeli parantez içine alınmış herhangi bir karakter eşleşmesi için kalıbın yürütülmemesi gereken bir koşulu belirtir

/ [^ QA] WERTY / eşleşmiyor QWERTY, ile birlikte MUHTEŞEM

"Eşleşen meta karakterler" tablosunda listelenen karakterler, \\ t - tablolama, \\ n - yeni satır vb. gibi dizelerde kullanılan atlama karakterlerinin sırası ile karıştırılmamalıdır.

nicel meta karakterler

tesadüf sayısı

Sıfır veya daha fazla kez

/ Ja * vaScript / ile çakışır JvaScript veya ile JavaScript veya ile JaaavaScript, eşleşmiyor JovaScript

Sıfır veya bir kez

VaScript / sadece eşleşir JvaScript veya ile JavaScript

Bir veya daha fazla kez

/ Ja + vaScript / ile çakışır JavaScript veya ile JavaScript veya ile JaaavaScript, eşleşmiyor JvaScript

tam olarak n kere

/ Ja (2) vaScript / sadece eşleşir JavaScript

n veya daha fazla kez

/ Ja (2,) vaScript / ile çakışır JavaScript veya ile JaaavaScript, eşleşmiyor JvaScript veya ile JavaScript

en az n kez, ancak m'den fazla değil

/ Ja (2, 3) vaScript / sadece eşleşir JavaScript veya ile JaaavaScript

"Sayısal Meta Karakterler" tablosunda listelenen her karakter, normal ifadede bir önceki karaktere veya meta karaktere uygulanır.

Konumlandırma meta karakterleri

Son meta karakter kümesi, bir dizenin başında veya sonunda bir alt dize için nereye (önemliyse) bakılacağını belirtmek için tasarlanmıştır.

Şablonlarla çalışmak için bazı teknikler

yer değiştirmek- bu yöntemi makalenin en başında zaten kullandık, bir kalıp aramak ve bulunan alt dizeyi yeni bir alt dize ile değiştirmek için tasarlanmıştır.

yürütmek- bu yöntem, şablon tarafından verilen desene göre dize eşleştirmesi gerçekleştirir. Desen başarısız olursa, null döndürülür. Aksi takdirde, sonuç, verilen modelle eşleşen bir dizi alt dizidir. / * Dizinin ilk elemanı, verilen desenle eşleşen orijinal dizeye eşit olacaktır * /

Örneğin:

sonuç olarak, dört satır elde ederiz:
Doğum tarihi: 09/15/1980
Doğum günü: 15
Doğum ayı: 09
1980 doğumlu

Çözüm

Makale, düzenli ifadelerin tüm olanaklarını ve cazibesini göstermiyor; bu konuyu daha derinlemesine incelemek için RegExp nesnesini incelemenizi tavsiye ederim. Ayrıca, düzenli ifadelerin sözdiziminin hem JavaScript'te hem de PHP'de farklı olmadığına dikkatinizi çekmek istiyorum. Örneğin, bir e-posta girişinin doğruluğunu kontrol etmek için JavaScript ve PHP için normal bir ifade aynı görünecektir. /[e-posta korumalı]+.(2,3) / ben.