2010-09-30 39 views
18

Burada, modern düzenli ifadelerin normal bir dilde temsil edilebilecek olanın ötesine geçtiğine değinen birkaç yorum gördüm. Bu nasıl?Modern düzenli ifade lehçeleri düzenli değil mi?

Modern düzenli ifadelerin hangi özellikleri normal değil? Örnekler yardımcı olabilir. 'Doesn hello worldhello hello maçlar:

(\w*)\s\1 

(bir boşluk karakteri tarafından takip sözcük karakterleri bir grup, kibrit ve ardından aynı grup, daha önce eşleşmiş) örn:

+2

Bu muhtemelen bir topluluk wiki –

+0

@webdestroya olmalıdır? – BoltClock

+0

@NullUser - Bu oldukça öznel bir soru değil mi? –

cevap

18

akla gelen ilk şey geribaşvurularla olduğunu t.

Bu yapı normal değil (ör. regular grammar tarafından oluşturulamıyor). Bu dan (dengeli parantez ve "a" s herhangi bir kombinasyonu eşleştirmek için kullanılabilir

\((a*|(?R))*\) 

: normal olmayan Perl uyumlu RegExp (PCRE'nin) tarafından desteklenen


başka özelliği, yinelemeli desenleri wikipedia)

+2

Bazı geriatlamalar normal bir dilde yapılabilir. Örneğin 'x \ 1' düzenli dili tanımlar (.): "AXA", "BXB" vb Ben geribaşvurularla dil düzensiz hale Kleene kapanışları ile birleştirildiğinde yalnızca inanıyoruz. – Gabe

+1

Oradaki boşluğa ihtiyacınız yok. '(. *) \ 1' yapacak. – Nabb

+0

@Nabb: '.', çok daha geniş bir karakter aralığı ile eşleşir. \' \ W * \ s' – BoltClock

3

Deterministik veya belirsiz sonlu bir otomatikman, normal ifadelerle tanımlanan normal dilleri tanır. Düzenli ifadenin tanımı basittir. S bir alfabe olsun. Sonra boş set, boş dize ve S'un her elemanı normal ifadelerdir (S üzerinden). Normal ifadeler olsun, ve ve v'a izin verin. Ardından sendika (u | v), birleştirme (uv) ve kapatma (u *) u ve vüzerinde düzenli ifadeler S bulunmaktadır. Bu tanım, normal dillere kolayca genişletilebilir. Başka hiçbir ifade normal bir ifadedir. Belirtildiği gibi, bazı geri referanslar bir örnektir. Düzenli diller ve ifadeler hakkındaki Wikipedia sayfaları iyi referanslardır. Özünde, belirli "düzenli ifadeler" düzenli değildir çünkü belirli bir tipte herhangi bir otomat, bunları tanımak için oluşturulmamıştır. Örneğin, dil

{a^i b^i: i < = 0}

düzenli değildir. Bunun nedeni, kabul eden otomasyonun sonsuz sayıda devlete ihtiyaç duymasıdır, ancak normal dilleri kabul eden bir otomasyon sınırlı sayıda devlete sahip olmalıdır.

+0

Özgün sorudan yola çıkarak, düzenli ve normal olmayan diller arasındaki ayrımı anladığından eminim. Sorusu, modern “düzenli ifade” uygulamalarının hangi özelliklerinin düzenli olmayan dilleri tanımladığı ve bu nedenle listelediğiniz işlemleri kullanarak bir şekilde ifade edilememesidir. –

+1

Belki daha yakından okumalıyım o zaman! Her durumda, zarar verdiğimi düşünmüyorum. – danportin

+2

'a^i b^i' kesinlikle düzensiz (bu bir DCFG), ancak bunu programlama dillerinin" normal ifadeleri "kullanarak gerçekten ifade edebilir miyiz? – Nabb

4

Birkaç örnek:

  • Düzenli ifadeler gruplama destekler. Örneğin. Ruby'de: /my (group)/.match("my group")[1] "grup" çıkacak. Bir grupta bir şey saklamak, sonlu bir otomatikmanın sahip olmadığı harici bir depolamayı gerektirir.
  • Birçok dil, örneğin C#, destek yakalar, yani her bir eşleşmenin bir yığın üzerinde yakalanacağı - örneğin (?<MYGROUP>.)* modeli, "." Çoklu yakalamalarını gerçekleştirebilir. aynı grupta.
  • Gruplama yukarıdaki kullanıcı NullUserException tarafından işaret edildiği gibi backreferencing için kullanılır. Backreferencing Aşağı itilen bir-otomat (bir yığın şey itmek ve gözetleme veya sonradan pop edebilmek zorunda gücü ile bir veya birden fazla harici yığınlarını gerektirir.
  • Bazı motorlar
  • ayrı bastırıyor ve dış haşhaş olanağına sahip yığınları ve yığın boş olup olmadığını kontrol NET'te, aslında (?<MYGROUP>test) bir yığın iter, (?<-MYGROUP>) bir yığın çıkar iken
  • NET motoru gibi Bazı motorlar dengeli bir gruplandırma kavramına sahip -.. bir dış yığın hem itilebilir ve aynı anda attı. Dengeli gruplandırma sözdizimi LASTGROUP çıkar ve FIRSTGROUP yığın LASTGROUP endeksi beri yakalama iter (?<FIRSTGROUP-LASTGROUP>) olduğunu. Bu aslında sonlu automato gücünün ötesinde kesinlikle hangi sonsuz iç içe yapılar maç için kullanılabilir n. Daha fazla Regex en ve dengeli gruplama ve sonlu otomata daha böylece daha yüksek mertebeden otomata ile birlikte dış yığınlar uygulanması bazı ayrıntıları ilgilendiğiniz takdirde

Muhtemelen diğer iyi örnekler :-) var, bir keresinde iki kısa makaleler yazdı Bu konuda (http://www.codeproject.com/KB/recipes/Nested_RegEx_explained.aspx ve http://www.codeproject.com/KB/recipes/RegEx_Balanced_Grouping.aspx).

Neyse - finitieness ya da değil - bu ilave malzeme düzenli dillere getiren güç büyük :-)

Br olduğunu blieve. neden olmasın SO ben CW anlayabiliyorum ama: Morten

+1

Gruplama ve yakalama dili düzensiz yapan özelliklerden ibaret değildir; bunların hepsi meta veri sağlar, dilin açıklığını değiştirmez. Açıkçası, bir yığın (geri referanslar gibi) içeren her şey düzensiz dilleri yapmak için yapar. – Gabe