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?
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?
Yanıtlar:
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.
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.
re.compile
tanı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.
#
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.
#
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 )
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.
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
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.
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ı).
Yorumlar, kodda açık olmayan yararlı bilgiler eklemelidir.
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.
RegEx ayrı bir sınıfa anlamlı bir ada sahip bir ayıklayın. Sonra kodu otomatik testlerle belgeleyeceğim.
Bu,
Doğal olarak, sınıfınız birkaç normal ifadeye ev sahipliği yapabilir.