Normal ifadeleri yorumlama


11

Normal ifadeleri yorumlamak için yaygın uygulamalar var mı: RegEx'in farklı kısımlarına atıfta bulunan satır içi yorumlar veya tüm ifadeler için genel yorum?


2
Var ama daha spesifik olmanız gerekiyor. Örneğin Bash satır içi yorumları destekler ve Python ayrıntılı düzenli ifadeler sunar.
sakisk

6
Düzenli ifadeler için temel kuralım: Düzenli ifadeyi yorumlamanız gerekiyorsa, bu çok karmaşıktır.
zzzzBov

1
Ve her zaman bu bağlantıyı ekleyin
Kieveli

Bunu yorumlamak zorunda kalırsanız, çok karmaşık olduğunu kabul etmiyorum. Karmaşık bir normal regex size tonlarca göz cama zorunluluk kodunu koruyabilir. Normal ifadeyi atamak için iyi bir açıklayıcı değişken adı kullanın. Hala yeterince net değilse, orijinal amacı normal ifadenin arkasına aktarmak için kısa bir yorum kullanın .
Craig

Yanıtlar:


10

Bana göre, iyi bir uygulama, düzenli ifadenin genel fikrinin ne olduğunu yorumlarda kısaca belirtmektir. Bu, diğer geliştiricilere (veya bazen kendinize), regex'i RegExr gibi bir ayrıştırıcıya kopyalayıp yapıştırma zahmetinden kurtarır , yalnızca ne yaptığını anlamak için.


2
RegExr, geliştirici regex savant olmadıkça yine de gerçekleşecektir. Ancak genel bir açıklama sağlamayı kabul ediyorum; Normal ifadelerimle yaptığım şey bu.
Robert Harvey

3
+1: Daha ayrıntılı olan her şey, yorum olarak normal ifadeyle bir kilitlenme kursu haline gelecektir.
Matt

Bu cevap ve @zzzzBov yorumları mantıklı.
m0nhawk

1
Düzenli ifadeyi anlamak için sadece sıkıcı inceleme zahmetinden kurtulmakla kalmaz, aynı zamanda orijinal programlayıcının amacını açıkça ortaya koyar, özellikle orijinal programcının düzenli ifadeyi köknar zaman boyunca yanlış yapma olasılığı göz önüne alındığında. Bununla birlikte, birçok durumda normal ifadenin iyi bir değişken adına atanması, yeterli niyet belgelerinin sağlanmasında uzun bir yol olabilir.
Craig

9

Bu biraz dile özgü bir cevaptır, ancak soruda herhangi bir dil belirtilmemiştir.

"Python'a Dalış" kitabı , Ayrıntılı Düzenli İfadeler kullanarak yorum yapılmasını önermektedir :

Python bunu ayrıntılı düzenli ifadeler denilen bir şeyle yapmanıza izin verir. Ayrıntılı düzenli ifade, kompakt düzenli ifadeden iki şekilde farklıdır:

  • Boşluk yoksayılır. Boşluklar, sekmeler ve satır başları boşluklar, sekmeler ve satır başları döndürmelerle eşleşmez. Hiç eşleşmiyorlar. (Ayrıntılı düzenli ifadedeki bir alanı eşleştirmek istiyorsanız, önüne ters eğik çizgi koyarak boşluktan kaçmanız gerekir.)
  • Yorumlar yok sayılır. Ayrıntılı bir normal ifadedeki yorum, Python kodundaki bir yorum gibidir: bir #karakterle başlar ve satırın sonuna kadar gider. Bu durumda, kaynak kodunuz yerine çok satırlı bir dize içindeki bir yorumdur, ancak aynı şekilde çalışır.

Misal:

>>> pattern = """
^                   # beginning of string
M{0,4}              # thousands - 0 to 4 M's
(CM|CD|D?C{0,3})    # hundreds - 900 (CM), 400 (CD), 0-300 (0 to 3 C's),
                    #            or 500-800 (D, followed by 0 to 3 C's)
(XC|XL|L?X{0,3})    # tens - 90 (XC), 40 (XL), 0-30 (0 to 3 X's),
                    #        or 50-80 (L, followed by 0 to 3 X's)
(IX|IV|V?I{0,3})    # ones - 9 (IX), 4 (IV), 0-3 (0 to 3 I's),
                    #        or 5-8 (V, followed by 0 to 3 I's)
$                   # end of string
"""
>>> re.search(pattern, 'M', re.VERBOSE)                1

Kaynak ve diğer ayrıntılar burada

Bu yöntem, arayanın desenin ayrıntılı bir biçimde yazıldığını bilmesi ve buna göre çağırması gerektiğinin hafif bir dezavantajına sahiptir.


2
Deseni bir değişkende saklamak yerine, deseninizi re.compiletanımladığınız noktada kullanabilir ve yalnızca elde edilen nesneyi saklayabilirsiniz. Bu şekilde, desen derleme bayraklarının (dahil re.VERBOSE) desenin kendisinden ayrılması gerekmez.
John Bartholomew

Gerçekten yardımcı cevap, teşekkürler! Ama #ayrıntılı bayrağı kullanıyorsam nasıl eşleştirebilirim ? Bu arada: kaynak bağlantılar çalışmıyor gibi görünüyor.
winklerrr

Tamam, yani #bir karakter sınıfının içindeyken tam anlamıyla eşleştirilebilir: [#](kaynak: docs.python.org/3/library/re.html#re.X )
winklerrr

8

Tipik olarak, bir regex yazacağım ve regex'in bireysel parçalarını açıklamayacağım, aksine amacını açıklayacağım. Bu ne ve neden. Bu biraz "Yorumlarım nasıl olmalı?" hangisine " kodun ne yaptığını yazma, kodun neden yaptığını yaptığını yazın "

// Strip the leading "?" and remove the query parameters "offset=<integer>" & "count=<integer> so we have a pattern of the request"          
var search = location.search.substring(1).replace(/offset=[0-9]+?&/g, "").replace(/count=[0-9]+?&/g, "");

Birine kodlardaki yorumlar yoluyla regexes'i öğretmeye çalışmadığınız sürece, her bir parçanın ne yapacağını açıklamayı düşünmüyorum. Diğer programcılarla çalışırken, bir şeyin küresel düzenli ifadeler olarak bileceğini varsayabilirsiniz.


3
şaşıracaksınız ...
Matt

6

Bence bu normal ifadeyi nasıl bir araya getirdiğinize bağlı. Genel olarak konuşursak, gerçek regex dizesinin içine yorum koymak kötü bir fikir olacağını düşünüyorum (bildiğim kadarıyla çoğu senaryoda mümkün değil). Düzenli bir ifadenin belirli bölümlerini gerçekten yorumlamanız gerekiyorsa (birine öğretmeye mi çalışıyorsunuz?), O zaman her bir parçayı kendi satırlarında ayrı dizelere ayırın ve programlama satırınız için normal yorumlama işlemini kullanarak her satırı yorumlayın. Aksi takdirde, pleinolijf'in cevabı oldukça iyi.

misal:

string myregex = "\s" // Match any whitespace once
+ "\n"  // Match one newline character
+ "[a-zA-Z]";  // Match any letter

4

Genellikle adı normal ifadenin genel amacını açıklayan bir dize sabiti tanımlarım.

Örneğin:

const string FloatingPointNumberPattern = @"[-+]?[0-9]*\.?[0-9]+";

Bu sabitin üzerine bir açıklama eklemek için bir yorum ekleyebilirsiniz, ancak genellikle sabit adın kendisi yeterli olacaktır.


1
Hakkında bu cevap gibi ekstra bir şey I birden fazla noktada kullanılan alırsa, niyet olmasıdır vardır bunu yorum yapmak hiçbir şey unutma - çok etrafında yapılacak.
J Trana

3

Bazı senaryolarda, geliştirici (ler) metni tipik alan adlarının dışında eşleştirmek için düzenli ifadeler kullanıyor olabilir. Orijinal geliştiriciler, yalnızca bu yinelemeli süreçte keşfedilmiş olabilecek çeşitli uç durumları yakalayan birçok yinelemeden geçmiş olabilir. Bu nedenle, sonraki geliştiriciler, genel durumun farkında olsalar bile, orijinal geliştiricilerin uğraştığı birçok uç durumun farkında olmayabilir.

Bu gibi durumlarda, varyasyonların örneklerini belgelemek faydalı olabilir. Bu dokümantasyonun yeri miktara bağlı olarak değişebilir (örn. Kodda olması gerekmez).

Buna yaklaşmanın bir yolu, gelecekteki geliştiricilerin normal ifadelerin nasıl çalıştığı gibi sadece temel bilgiye sahip olacağını varsaymaktır, ancak (1) gelecekteki geliştiriciler veya (2) geliştirme sırasında edindiğiniz bilgiler (örneğin keşfedilen son durumlar)

Örneğin, geliştirme sırasında "Oh, X'in bu formu alabileceğini bilmiyordum" gibi bir şey söylüyorsanız, bunu belgelemeye değer (ve belki de regex'in bu varyasyonu işleyen kısmı).


2

Yorumlar, kodda açık olmayan yararlı bilgiler eklemelidir.

  1. İfadenin kodun kendisinde veya bir yorumda gereksinimler düzeyinde ne yapması gerektiğini anlamayı kolaylaştırın. İfadenin arkasındaki amaç nedir, e-posta adreslerini doğrulamak veya Kanada telefon numaralarını seçmek.
  2. İfadenin gerçekte ne yaptığını, yani ifadenin neyi değerlendirdiğini anlamayı kolaylaştırın. İlk önce ifadeyi bölerek netleştirmeye çalışın, önce tüm tireleri kontrol edip tüm sayıları kaldırırsanız, ara değerleri tutan değişkenlere sahip iki parçalı bir ifadenin okunmasını çok daha kolaylaştıracak ve okuyucu tek seferde bir adımda mantığınıza adım atabilir. (SE'de birisinin bit manipülasyonu '>>' içeren bazı eski kodları deşifre etmeye çalıştığı ve cevabın sadece kodun gerçekten ne yaptığını değil aynı zamanda belirli bayrakların belirlendiğini öğrenmek için ünlü bir cevap var. sorunun yazarı gelecekte tam olarak anlatmaya çalıştığım şey bu tür bir kod çözme hakkında gitmek gerekir ama ben '

Her son döngüye ihtiyaç duyan az sayıda uygulama vardır, eğer büyük veri setlerini desenle eşleştiriyorsanız, belki de daha iyi bir yol vardır, belki değil, ama çoğu şey için ekstra yürütme süresi büyük bir anlaşma değildir.

Ve bir sonraki kişinin kodunuza rastlamasını ve bir hatayı düzeltmesini altı ay içinde siz olabilirsiniz ve ne yapması gerektiğini hatırlamanın hiçbir yolu yoktur.


1

RegEx ayrı bir sınıfa anlamlı bir ada sahip bir ayıklayın. Sonra kodu otomatik testlerle belgeleyeceğim.

Bu,

  • Kodun gerçekten işe yaradığını - köşe kutuları için de
  • Hızlı bir "bugfix" in pek çok köşe vakasını sarsmamasını sağlar
  • Geri izlemenin devre dışı bırakıldığı optimizasyonları belgeleyebilir

Doğal olarak, sınıfınız birkaç normal ifadeye ev sahipliği yapabilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.