Guide
Regex Kopya Kağıdı: Her Geliştiricinin İhtiyaç Duyduğu Yaygın Desenler
Gerçekten kullanacağınız 25 desen, regex hatalarının yarısına sahip olan açgözlü/tembel ayrımı ve JavaScript regex'in PCRE'den nerede farklılaştığı.
By Buğra SözeriPublished
Çalışan bir regex ezberlenecek tek satır değildir; girdiniz ve lezzetiniz hakkındaki varsayımları olan bir satırdır. Bu kopya kağıdı her deseni gerçekte neyin eşleştiğiyle, kaçırdığı kenar durumlarla ve hangi regex motorlarında çalıştığıyla eşleştirir. Herhangi birini canlı regex test aracımıza yapıştırarak eşleşmeleri ve yakalamaları etkileşimli olarak görebilirsiniz.
Aşağıda kullanılan gösterim
Desenler bayrakların önemli olduğu durumlar dışında çevreleyen /.../ sınırlayıcılar olmadan gösterilir. ^ ve $'nin tek bir değere (tüm alan) sabitlendiğini varsayın. Bir desen evrensel olmayan özellikler kullandığında lezzet notu hangi motorlarda çalıştığını belirtir.
Tanımlayıcılar ve isimler
E-posta — izin verici
^[^\s@]+@[^\s@]+\.[^\s@]+$@ ve . ile ayrılmış, boşluk veya başka@ içermeyen üç karakter sınıfı. Gerçek dünyadaki neredeyse her e-postayı kabul eder ve en açık yazım hatalarını reddeder.
E-posta — HTML5 form spec
^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$WHATWG'in HTML input type=“email”için belirlediği desen. Spec açıkça “bilerek uyumsuz” der. Tarayıcı davranışını eşleştirmek istediğinizde bunu kullanın.
URL — yalnızca HTTPS
^https://[^\s/$.?#].[^\s]*$Slug (URL güvenli tanımlayıcı)
^[a-z0-9]+(?:-[a-z0-9]+)*$Gruplar arasında tek tire ile küçük harf ve rakamlar. Baştaki veya sondaki tire yok, çift tire yok. Her CMS'in kullandığı slug şekli budur.
Kullanıcı adı — alfanümerik ve alt çizgi, 3-20 karakter
^[A-Za-z0-9_]{3,20}$UUID (herhangi bir sürüm)
^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$UUID v4 (katı)
^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$Sayılar, para, kodlar
Tam sayı (işaretli)
^-?\d+$Ondalık sayı (işaretli, isteğe bağlı kesirli kısım)
^-?\d+(?:\.\d+)?$Para tutarı (ABD stili)
^\$?\d{1,3}(?:,\d{3})*(?:\.\d{2})?$Hex renk (3, 4, 6 veya 8 basamak)
^#(?:[0-9a-fA-F]{3,4}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$Semantik sürüm (semver 2.0.0)
^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$semver.org'da yayımlanan kanonik regex budur. Major, minor, patch, isteğe bağlı ön sürüm ve isteğe bağlı derleme meta verilerini yakalar.
Tarihler ve saatler
ISO 8601 tarihi (YYYY-MM-DD)
^\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\d|3[01])$ISO 8601 zaman damgası saat dilimiyle
^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})$SS:DD 24 saatlik zaman
^(?:[01]\d|2[0-3]):[0-5]\d$Ağ adresleri
IPv4
^(?:(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)\.){3}(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)$IPv6 — pratik
^(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$MAC adresi
^(?:[0-9A-Fa-f]{2}[:-]){5}[0-9A-Fa-f]{2}$Port numarası
^(?:6553[0-5]|655[0-2]\d|65[0-4]\d{2}|6[0-4]\d{3}|[1-5]\d{4}|[1-9]\d{0,3}|0)$0-65535, kesinlikle sınırlı.
Telefon numaraları
ABD telefonu — izin verici
^(?:\+?1[-.\s]?)?\(?\d{3}\)?[-.\s]?\d{3}[-.\s]?\d{4}$Uluslararası telefon (E.164)
^\+[1-9]\d{1,14}$E.164 ITU spesifikasyonudur: baştaki +, sıfır olmayan ülke kodu, ülke kodu dahil toplam 2-15 basamak. Boşluk yok, parantez yok. Her SMS ağ geçidinin ve çoğu CRM'nin beklediği format budur.
Niceleyici davranışı
Açgözlü (varsayılan)
*, +, ? varsayılan olarak mümkün olduğunca fazlasını eşleştirir. <b>.*</b> deseni<b>merhaba</b><b>güle güle</b> üzerinde yalnızca ilk etiketi değil tüm dizeyi eşleştirir.
Tembel (? soneki)
Niceleyiciyi mümkün olduğunca azını eşleştirecek hale getirmek için ? ekleyin. <b>.*?</b> yalnızca <b>merhaba</b>'yı eşleştirir; bu neredeyse her zaman istediğiniz şeydir.
Lookahead ve lookbehind
Lookaround'lar karakter tüketmeden koşul öne sürer. Sıfır genişliktedir.
- Pozitif lookahead
(?=...)— “ardından gelen.”\d+(?=px),px'yi eşleşmeye dahil etmedenpxtarafından izlenen rakamlarla eşleşir. - Negatif lookahead
(?!...)— “ardından gelmeyen.” - Pozitif lookbehind
(?<=...)— “öncesinde olan.” - Negatif lookbehind
(?<!...)— “öncesinde olmayan.”
Hatırlamaya değer lezzet farkları
- JavaScript: iyelik niceleyicisi yok, atomik grup yok, ES2018'den itibaren lookbehind.
gbayrağıString.match'i tüm eşleşmeleri döndürecek şekilde yapar ancakString.replace'i farklı davranır — JS regex'inin en çok hata yapılan köşesi. - PCRE (Perl Uyumlu): özellik üst kümesi. PHP, nginx, birçok komut satırı aracı tarafından kullanılır.
- Python: standart
remodülü birkaç özellik eksiğiyle PCRE'ye yakındır. Üçüncü tarafregexmodülü gerisini ekler. - Go (RE2): kasıtlı olarak doğrusal zamanlı. Geri referans yok, lookaround yok. Felaket geri izlemeye karşı bağışıklıdır.
- .NET: PCRE'ye benzer, artı iç içe parantezleri eşleştirmenizi sağlayan denge grupları gibi benzersiz özellikler.
Hiçbir zaman yazılmaması gereken desenler
- HTML ayrıştırma. Gerçek ayrıştırıcı kullanın.
- JSON ayrıştırma. Her dilde
JSON.parsevardır. - Programlama dili ayrıştırma. Ayrıştırıcı birleştirici veya gerçek dilbilgisi kullanın.
- İç içe sınırlayıcıları eşleştirmesi gereken her şey. Klasik düzenli diller sayamaz. Ayrıştırıcı kullanın.
Dürüst sonuç
Regex, küçük, iyi anlaşılmış bir alana sahip keskin bir araçtır: sabit şekilli dizeler, basit giriş filtreleme, metin düzenleyicilerinde ara ve değiştir. Bu kopya kağıdındaki desenler günlük kodda karşılaşılan durumların %80'ini kapsar. Regex şekilli görünen ancak regex olmayan %20 için — iç içe yapılar, doğal dil eşleştirme, anlamsal doğrulama — bunun yerine ayrıştırıcıya ulaşın.
Bir regex yazdığınızda, commit etmeden önce üç temsili giriş ve üç patolojik girişle test aracımıza yapıştırın. Tek test durumunuzda çalışan desen, başkasının üretimini çökertecek desendir.
Frequently asked questions
- E-posta regex'im neden geçerli adresleri reddediyor?
- Çünkü geçerli e-posta adresleri için RFC 5322 dilbilgisi bir sayfadan uzundur ve alıntılı yerel parçalar gibi yapılar içerir. Çoğu 'e-posta regex'i yaygın küçük bir alt kümeyi zorlar. Gerçek doğrulama için onay e-postası gönderin — regex yalnızca açık yazım hatalarını filtreleyebilir.
- Regex lezzetleri diller arasında gerçekten o kadar farklı mı?
- Evet. JavaScript lookahead'i destekler ancak lookbehind'ı yalnızca 2018'de (ES2018) ve aynı sürümde adlandırılmış grupları aldı. Python temel regex için re, gelişmiş özellikler için regex kullanır. PCRE en fazla özelliğe sahiptir. .NET'in kendine özgü tuhaflıkları vardır. Her zaman gerçek çalışma zamanında test edin.
- Açgözlü ve tembel niceleyiciler — hangisini isterim?
- Açgözlü (varsayılan) mümkün olduğunca fazlasını eşleştirir; tembel (? soneki) mümkün olduğunca azını eşleştirir. HTML etiketleri içindeki .* için neredeyse her zaman tembel istersiniz: .*? — aksi takdirde <b>merhaba</b><b>güle güle</b> ilk <b>'den son </b>'ye kadar her şeyi eşleştirir.
- Regex'i ne zaman kullanmamalıyım?
- HTML, JSON, YAML, programlama dilleri veya iç içe yapıya sahip herhangi bir şeyi ayrıştırırken. Regex düzenli diller için bir araçtır; saymak veya özyinelemek gerektiğinde gerçek bir ayrıştırıcı kullanın.
- URL doğrulamanın en güvenli yolu nedir?
- Gerçek dilde URL yapıcısına iletin — JavaScript'in new URL(input)'u, Python'un urllib.parse.urlparse'ı, Java'nın java.net.URI'si. Bunlar ilgili RFC'leri uygular ve regex'in işleyemeyeceği kenar durumları ele alır.
- Regex'im belirli girişlerde neden bu kadar yavaş?
- Felaket geri izleme. İç içe veya örtüşen niceleyicilere sahip desenler — (a+)+ veya (.*).* gibi — belirli girişlerde üstel süre alabilir. Cloudflare 2019 Temmuz'daki küresel kesinti tam olarak bunu yapan bir regex'ten kaynaklanıyordu.
Related
Published May 31, 2026