Yakında kullanıma sunulacak normal ifade özellikleri

ES2015, Unicode (/u) ve yapışkan (/y) işaretleri ile normal ifade söz diziminde yapılan önemli iyileştirmeler de dahil olmak üzere JavaScript diline birçok yeni özellik getirdi. Ancak o zamandan beri geliştirme çalışmaları durmadı. V8 ekibi, TC39'daki (ECMAScript standartları kuruluşu) diğer üyelerle yakın işbirliği içinde, normal ifadeleri daha da güçlü hale getirmek için çeşitli yeni özellikler önerdi ve ortaklaşa tasarladı.

Bu özellikler şu anda JavaScript spesifikasyonuna dahil edilmek üzere öneriliyor. Öneriler tam olarak kabul edilmemiş olsa da TC39 sürecinde 3. aşamaya ulaşmış durumda. Spesifikasyon kesinleşmeden önce ilgili teklif yazarlarına zamanında tasarım ve uygulama geri bildirimi sunabilmek için bu özellikleri bir işaretin arkasına (aşağıya bakın) uyguladık.

Bu blog yayınında, bu heyecan verici geleceğin bir önizlemesini bulabilirsiniz. Sonraki örnekleri takip etmek istiyorsanız chrome://flags/#enable-javascript-harmony adresinde deneysel JavaScript özelliklerini etkinleştirin.

Adlandırılmış yakalamalar

Normal ifadeler, eşleşen metnin bir bölümünü yakalayabilen yakalama (veya grup) içerebilir. Geliştiriciler şimdiye kadar bu yakalamaları yalnızca dizinlerine göre referans verebiliyordu. Bu dizin, yakalamanın kalıp içindeki konumuna göre belirleniyordu.

const pattern = /(\d{4})-(\d{2})-(\d{2})/u;
const result = pattern.exec('2017-07-10');
// result[0] === '2017-07-10'
// result[1] === '2017'
// result[2] === '07'
// result[3] === '10'

Ancak normal ifadelerin okunması, yazılması ve bakımı zaten zordur. Sayısal referanslar da daha fazla karmaşıklık katabilir. Örneğin, daha uzun kalıplarda belirli bir yakalamanın dizini belirlemek zor olabilir:

/(?:(.)(.(?<=[^(])(.)))/  // Index of the last capture?

Daha da kötüsü, bir desende yapılan değişiklikler mevcut tüm yakalamaların dizinlerini değiştirebilir:

/(a)(b)(c)\3\2\1/     // A few simple numbered backreferences.
/(.)(a)(b)(c)\4\3\2/  // All need to be updated.

Adlandırılmış yakalamalar, geliştiricilerin yakalamalara ad atamasına olanak tanıyarak bu sorunları azaltmaya yardımcı olan yakında kullanıma sunulacak bir özelliktir. Söz dizimi Perl, Java, .Net ve Ruby'ye benzer:

const pattern = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/u;
const result = pattern.exec('2017-07-10');
// result.groups.year === '2017'
// result.groups.month === '07'
// result.groups.day === '10'

Adlandırılmış yakalamalara, adlandırılmış geri referanslar ve String.prototype.replace aracılığıyla da referans verilebilir:

// Named backreferences.
/(?<LowerCaseX>x)y\k<LowerCaseX>/.test('xyx');  // true

// String replacement.
const pattern = /(?<fst>a)(?<snd>b)/;
'ab'.replace(pattern, '$<snd>$<fst>');                              // 'ba'
'ab'.replace(pattern, (m, p1, p2, o, s, {fst, snd}) => fst + snd);  // 'ba'

Bu yeni özelliğin tüm ayrıntılarını özellik önerisinde bulabilirsiniz.

dotAll işareti

Varsayılan olarak normal ifadelerdeki . atomu, satır sonlandırıcılar dışındaki tüm karakterlerle eşleşir:

/foo.bar/u.test('foo\nbar');   // false

Bir teklifte, /s işareti aracılığıyla etkinleştirilen dotAll modu tanıtılır. dotAll modunda ., satır sonlandırıcıları da eşleştirir.

/foo.bar/su.test('foo\nbar');  // true

Bu yeni özelliğin tüm ayrıntılarını özellik önerisinde bulabilirsiniz.

Unicode özelliği kaçış karakterleri

ES2015'te Unicode farkındalığıyla birlikte, sayı olarak kabul edilebilecek çok daha fazla karakter (ör. daire içine alınmış bir rakam: ①) veya kelime karakteri olarak kabul edilebilecek çok daha fazla karakter (ör. kar için Çince karakter: 雪) ortaya çıktı.

Bunlardan hiçbiri \d veya \w ile eşleştirilemez. Bu kısaltmaların anlamı değiştirilirse mevcut normal ifade kalıpları bozulur.

Bunun yerine, yeni mülk kaçış dizeleri kullanıma sunuluyor. Bu seçeneklerin yalnızca /u işaretiyle gösterilen Unicode'ye duyarlı normal ifadeler için kullanılabildiğini unutmayın.

/\p{Number}/u.test('①');      // true
/\p{Alphabetic}/u.test('雪');  // true

Ters değer, \P ile eşleştirilebilir.

/\P{Number}/u.test('①');      // false
/\P{Alphabetic}/u.test('雪');  // false

Unicode konsorsiyumu, matematik sembolleri veya Japonca Hiragana karakterleri gibi daha birçok özelliği tanımlar:

/^\p{Math}+$/u.test('∛∞∉');                            // true
/^\p{Script_Extensions=Hiragana}+$/u.test('ひらがな');  // true

Desteklenen Unicode mülk sınıflarının tam listesini mevcut spesifikasyon önerisinde bulabilirsiniz. Daha fazla örnek için bu bilgilendirici makaleyi inceleyin.

Önceki karakterleri kontrol etme iddiaları

İleriye dönük iddialar, başlangıçtan beri JavaScript'in normal ifade söz dizminin bir parçasıdır. Bu işlevin karşılığı olan geriye dönük iddialar nihayet kullanıma sunuluyor. Bazılarınız bunun V8'in bir parçası olduğunu uzun zamandır biliyordur. ES2015'te belirtilen Unicode işaretini uygulamak için arka planda geriye dönük doğrulama ifadeleri bile kullanıyoruz.

Ad, neyi ifade ettiğini zaten oldukça iyi açıklıyor. Bir kalıbı yalnızca geriye dönük arama grubundaki kalıptan önce geldiğinde eşleşecek şekilde kısıtlamanın bir yolunu sunar. Hem eşleşen hem de eşleşmeyen sürümleri vardır:

/(?<=\$)\d+/.exec('$1 is worth about ¥123');  // ['1']
/(?<!\$)\d+/.exec('$1 is worth about ¥123');  // ['123']

Daha fazla bilgi için geriye dönük doğrulamalara ve ilgili V8 test örneklerinde örneklere ayrılmış önceki blog yayınımıza göz atın.

Teşekkür ederiz

Bu blog yayınında, bu özelliğin hayata geçirilmesi için çok çalışan kişilerden bahsetmemek olmaz. Özellikle dil şampiyonları Mathias Bynens, Dan Ehrenberg, Claude Pache, Brian Terlson, Thomas Wood, Gorkem Yakin ve Irregexp gurusu Erik Corry'nin yanı sıra dil spesifikasyonuna ve V8'in bu özellikleri uygulamasına katkıda bulunan herkese teşekkür ederiz.

Bu yeni normal ifade özelliklerini bizim kadar heyecanla karşılayacağınızı umuyoruz.