Regex lezzetlerini bilin
Düzenli ifadelerin temelde dilden agnostik olduğunu düşünen şaşırtıcı sayıda insan vardır. Bununla birlikte, tatlar arasında aslında oldukça büyük farklılıklar vardır ve özellikle kod golf için bunlardan bazılarını ve ilginç özelliklerini bilmek iyidir, böylece her görev için en iyisini seçebilirsiniz. İşte birkaç önemli aroma ve bunları diğerlerinden ayıran şey hakkında genel bir bakış. (Bu liste tam olarak tamamlanamıyor, ancak gerçekten göze batan bir şeyi özledim mi bana bildirin.)
Perl ve PCRE
Bunları tek bir kabın içine atıyorum, çünkü Perl lezzetine pek aşina değilim ve çoğunlukla eşdeğerler (PCRE sonuçta Perl Uyumlu Düzenli İfadeler içindir). Perl lezzetinin en büyük avantajı, aslında regex ve ikame içinden Perl kodunu çağırabilmenizdir.
- Özyineleme / alt yordamlar . Muhtemelen golf oynamak için en önemli özellik (sadece birkaç çeşitte var olan).
- Şartlı desenler
(?(group)yes|no)
.
- Destekler ile yedek dizesindeki davanın değiştirmek
\l
, \u
, \L
ve \U
.
- PCRE, her bir alternatifin farklı (ancak sabit) bir uzunluğa sahip olabileceği göz alıcı alanlarda değişime izin verir. (Perl de dahil olmak üzere çoğu lezzet, genel bir sabit uzunluğa sahip olmak için göz alıcı gerektirir.)
\G
Bir eşleşmeyi önceki eşleşmenin sonuna
\K
maçın başlangıcını sıfırlamak için
- PCRE, hem Unicode karakter özelliklerini hem de komut dosyalarını destekler .
\Q...\E
daha uzun karakterlerden kaçmak için. Birçok meta karakter içeren bir dizeyle eşleşmeye çalıştığınızda kullanışlıdır.
.AĞ
Bu, muhtemelen sadece çok az eksiklik olan en güçlü lezzet.
Golf açısından önemli bir eksiklik, diğer bazı tatlar gibi iyelik miktarlarını desteklememesidir. Bunun yerine .?+
yazmak zorundasınız (?>.?)
.
Java
Yakut
Son versiyonlarda, bu lezzet, alt rutin çağrıları da içeren PCRE kadar güçlüdür. Java gibi, karakter sınıflarının birleştirilmesini ve kesişmesini de destekler. Özel bir özellik, onaltılık basamaklar için yerleşik karakter sınıfıdır: \h
(ve olumsuzlananlar \H
).
Golf oynamanın en kullanışlı özelliği Ruby'nin miktar belirleyicileri nasıl kullandığıdır. En önemlisi, nicelikleri parantez olmadan yerleştirmek mümkündür. .{5,7}+
çalışır ve yapar .{3}?
. Aynı zamanda, diğer tatların çoğunun aksine, bir niceleyici üzerindeki alt bağın kullanılmaması 0
durumunda, örneğin .{,5}
eşdeğerdir .{0,5}
.
Subroutinler gelince, PCRE'nin subroutines ve Ruby'nin değişmezler arasında büyük fark, Ruby'nin sözdizimi bir bayt daha uzun olmasıdır (?n)
vs \g<n>
ama PCRE bir altprogram tamamlandıktan sonra yakalar sıfırlar oysa Ruby'nin modüller, kaynak yakalamak için kullanılabilir.
Son olarak, Ruby, çizgiyle ilgili değiştiriciler için diğer pek çok tada göre farklı semantiklere sahiptir. Genellikle m
diğer lezzetlerde denilen değiştirici daima Ruby'dedir. Yani ^
ve $
her zaman başını ve sonunu maç hattı değil sadece başlangıç ve dize sonu. Eğer bu davranışı gerekiyorsa bu size bayt kurtarabilirsin ama bunu yapmazsanız Değiştirmeye gerekecek, çünkü ekstra bayt mal olacak ^
ve $
birlikte \A
ve \z
sırasıyla. Buna ek olarak, genellikle denilen değiştirici s
( .
eşleşen satırları besleyen) m
yerine Ruby denir . Bu, bayt sayısını etkilemez, ancak karışıklığı önlemek için akılda tutulmalıdır.
piton
Python'un katı bir lezzeti var, ama başka hiçbir yerde bulamayacağınız özellikle kullanışlı özelliklerin farkında değilim.
Bununla birlikte , modülün bir noktada değiştirilmesi amaçlanan ve birçok ilginç özellik içeren alternatif bir lezzet vardır re
. Özyinelemeye, değişken uzunluklu görünümlere ve karakter sınıfı birleştirme operatörlerine destek eklemenin yanı sıra, bulanık eşleştirme özelliğine de sahiptir . Temelde, izin verilen bir dizi hata (yerleştirme, silme, değiştirme) belirtebilirsiniz; motor size yaklaşık eşleşmeler de verecektir.
ECMAScript
ECMAScript tadı çok sınırlıdır ve bu nedenle golf oynamak için nadiren kullanışlıdır. Bunun için tek yol , koşulsuz olarak başarısız olan boş karakter sınıfının yanı sıra herhangi bir karakterle eşleşmesi gereken olumsuz karakter [^]
karakteridir []
(normalin aksine (?!)
). Ne yazık ki, lezzet normal problemler için ikincisini faydalı kılan hiçbir özelliğe sahip değildir.
Lua
Lua'nın oldukça kendine özgü bir tadı vardır; bu da oldukça sınırlıdır (örneğin, grupları bile ölçemezsiniz) ancak bir avuç yararlı ve ilginç özellik içerir.
- Noktalama işaretleri, büyük / küçük harf karakterleri ve onaltılık sayılar dahil yerleşik karakter sınıfları için çok sayıda kısa yol bulunur .
- İle
%b
çok kompakt bir sözdizimi destekleyen dengeli dizeleri eşleşecek. Örneğin, %b()
a (
ve daha sonra her şeyi eşleştirmeye eşleştirir )
(iç eşleşen çiftleri doğru şekilde atlamak). (
ve )
burada herhangi iki karakter olabilir.
artırmak
Boost'un regex tadı aslında Perl'in. Ancak, dahil regex ikamesi için bazı güzel yeni özelliklere sahip vaka değişiklikler ve Koşullamalar . İkincisi, bildiğim kadarıyla Boost'a özgüdür.