Normal ifadenin tanımı nedir?


10

Kısa bir süre önce Ghoti ile bu soruya verdiğim cevaba yapılan yorumlarda nelerin düzenli bir ifade oluşturduğuna dair dostane bir tartışmaya girdim . Aşağıdakilerin düzenli bir ifade olduğunu iddia ettim:

`[Rr]eading[Tt]est[Dd]ata`

Ghoti, bunun yerine bir dosya küresi olduğunu iddia ederek aynı fikirde değildi. Glob wikipedia iddiaları o (vurgu benim) sayfa:

Globlar, ifadenin önceki bölümünün çoklu tekrarlarına izin veren Kleene yıldızı için sözdizimi içermez; bu nedenle, herhangi bir sonlu alfabe üzerinde daha geniş bir düzenli dil kümesini tanımlayabilen normal ifadeler olarak kabul edilmezler.

Bununla birlikte, bu iddia için sadece belirli bir wikipedia editörünün görüşü olduğunu belirten bir alıntı yoktur.

Single UNIX ® Şartname, Versiyon 2 , devletler Temel Düzenli İfade (BRE) hatta tek bir karakter olabilir:

Sıradan bir karakter, kendisiyle eşleşen bir BRE'dir: BRE Özel Karakterleri'nde listelenen BRE özel karakterleri hariç, desteklenen karakter kümesindeki herhangi bir karakter.

Peki, * nix dünyasındaki normal ifadenin tanımı nedir ve bu tanım dosya globlarını içermez mi?


6
Teorik CS'de, düzenli ifade, sonlu bir otomat tarafından tanınabilen normal bir dilin tanımıdır. Unix dünyasında, çok daha karmaşıktır ve tek bir tanım yoktur. Orada POSIX Spec 2 regex lehçeleri şunlardır: genişletilmiş ve temel, ister araçları tarafından kullanılan grep, sedve awk. Vim, Perl gibi kendi çeşitliliğini kullanır.
jw013

Yani, bu tanım gereği, bir dosya topak olan bir BRE doğru mu?
terdon

2
Hayır, bir dosya glob bir BRE DEĞİLDİR - ne olduğunu düşündüren nedir? BRE'nin POSIX açıklamasını ve globbingin POSIX açıklamasını okuduysanız, bunların aynı olmadığını fark edeceksiniz. Örneğin, *BRE ve globlarda iki farklı anlamı vardır. Not: Glob teriminin POSIX spesifikasyonunun herhangi bir yerinde kullanıldığını düşünmüyorum - bunun yerine Desen Eşleme olarak adlandırılıyor ve kabuk dili bölümünde açıklanıyor .
jw013

Yanıtlar:


10

Lk- belirttiğimiz gibi seçeneği bir topak, bir düzenli ifade olarak argüman görür.-namefind

Bir dizenin bir glob, bir normal ifade ya da sadece düz bir dize olarak yorumlanıp yorumlanmaması, yorumlamayı yapmak için kullanılan şeye bağlıdır. Bu bir bağlam meselesi. Sizin örnekte dize, [Rr]eading[Tt]est[Dd]atafarklı şekillerde bir dizi değerlendirilir, ama ne olabilir olduğunu bunu nasıl kullandığınıza bağlıdır. Glob olarak kullanın, bu bir glob. Bir normal ifade olarak kullanın, bu bir normal ifade. Bunun ortaya çıktığı soru söz konusu olduğunda OP dizeyi normal ifade olarak tanımladı. Bu nedenle, bunu bir normal ifade olarak yorumlamayı planladığını varsayabiliriz.

Tek bir karakter de kesinlikle normal ifade olabilir. Ayrıca bir dize olabilir ve bir glob da olabilir. İsterseniz bayt veya minik bir yorum olarak yorumlanabilir. Her şey bağlama bağlıdır.

Çeşitli biçimlerde düzenli ifadeler için bir takım özellikler vardır. BRE ve ERE iyi belgelenmiştir. PCRE, işlevsellik grupları ekler. Birçok regex tercümanı, örneğin, "ERE'nin ve PCRE'nin bir kısmını" uygulayacaktır. Ya da ERE eksi bir özellik yaparlar. Resmi teknik özelliklere göre hareket ederseniz, birçok araç yanlış veya eksik olduğu normal ifade desteğini talep eder. Ayrıntıları bilmek, çözümlerinizi, normal ifadenizi değerlendiren herhangi bir araçta bulunan işlevsellik koleksiyonuna uyarlamanıza olanak tanır.

Yani ... globları "hariç tutan" tanımları arıyorsanız, buna yanlış bir perspektiften bakıyorsunuz demektir. Ne olduğu onu nasıl kullandığınıza göre belirlenir .


7

[Rr]eading[Tt]est[Dd]atahem bir glob hem de düzenli bir ifade olarak geçerli gibi görünüyor ve her iki yorumda da aynı "anlamı" olduğuna inanıyorum. Bununla birlikte, -nameseçeneği find, argümanı normal bir ifade olarak değil, bir küre olarak ele alacaktır.

Bu ayrım foo*, hem geçerli bir glob hem de geçerli bir düzenli ifade olan, ancak yoruma bağlı olarak farklı bir anlamı olan bir argüman sağlamanız durumunda önemli olacaktır :

Bir gıdım deseni olarak yorumlanır, bu maç olacak foo, foobar, foo123vb

Normal ifade olarak yorumlanır, bu maç olacak fo, foo, foooooovb


Teşekkürler, bir glob paterni ile normal ifade arasındaki farkı görüyorum. Normal ifadenin resmi tanımı nedir?
terdon

1
Terim yaygın olarak kullanıldığı için "düzenli ifadeler" için tek bir tanım olup olmadığını bilmiyorum. POSIX normal ifadeleri veya Perl normal ifadeleri gibi, arka referanslar veya gözcü gibi diğer "özellikleri" içeren farklı sözdizimi özellikleri vardır. Bunlar artık en katı anlamda (normal biçimsel diller bağlamında) düzenli ifadeler olmayabilir, ancak yine de bu şekilde ifade edilmektedir.
lk-
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.