Matematiksel olarak, bir düzenli ifade kullanarak bir düzenli ifade doğrulamak mümkün değildir. Bu yüzden (formal) düzenli ifadeler sadece tanımak çünkü regular languages. Bir dil herhangi bir set dizeleri olduğunu. Örneğin, tüm ondalık sayılar kümesi (arada bir düzenli ifade kullanarak tarif edilebilir) bir dildir; Tüm geçerli düzenli ifadelerin kümesi de bir dildir. Regular dilleri kabul edilmesi için sadece fixed finite memory (giriş boyutu değil işlevi) gerektiren dillerdir.
Tüm geçerli düzenli ifadeler içeren dili düzenli bir dil değildir; dolayısıyla bir düzenli ifade kullanarak bir düzenli ifade tanımak mümkün değildir.
Bunu anlamak için, düzenli ifadeler eşleşmelidir onlara parantez içerdiğini fark. Bu nedenle, bir "(" oluştu, a ")" daha sonra ortaya gerekiyorsa. Bu sadece sonlu bellek, sabit bir makine ile açıklamak mümkün değildir. Orada were bir bunu yapmak için bir yol, ve düzenli ifade (bazı tamsayı K için) K farklı devletlerin sonlu bir hafıza, K açıklığı olan bir ifade olsaydı, ardından parantez için K parantez kapatma, geçerli bir normal ifade unable Bu makine tarafından tanınması için olurdu ama - bir contradiction (haber resmi dilde, bizim varsayım bu metin işleme biriyle oluşur olduğunu uygulanan normal ifadeler için aynı sağa, soldan) bir seferde bir karakter. Biz düzenli ifadeler context-free olup regular açıklayan biri olarak dil diyoruz.
(Düzenli ifadeler Pumping Lemma kullanarak düzenli bir dil oluşturma olmadığını kanıtlamak için önemsiz)
Yani, düzenli ifadeler kullanarak düzenli ifadeleri tanımada temel bir bilgisayar sorun var: It is mathematically impossible to do so.
Düzenli diller sonlu states ile finite-state automata, yani makineler tarafından ancak bellek olmadan kabul edilmesi mümkündür. Senin sorunun üstesinden gelmek için, giriş büyüklüğüne bağlıdır bazı bellek eklemeniz gerekir. Onlar bağlam ücretsiz olarak düzenli ifadeler, (neyse ki onlar değil, bazı karanlık, zor tanımak dil türü) bir push-down otomat kullanarak doğrusal zamanda kabul edilebilir. Bu bir bir defada ifade bir belirteci (genellikle bir karakter) geçer ve o verileri "iter", yani, bir stack görülen ne izler döngüsü "için" o laters "çıkar "İlk-in-son-out moda. (Veri örneği yığına: "Ben` a eş bulmak için hatırlamak gerek) 'sonra! "; İhtiyacınız kadar bu kadar çok kez "push" olabilir; Eğer gerçekten needed daha önce bir parantez açma uyumlu olması için kontrol gerektiğinde), daha sonra "pop" olabilir.
Tabii, düzenli ifadeler için kendi tanıma motoru yazılı bir yükü biraz olurdu - ama bunu yapmak istiyorsanız, yukarıda belirtilen sınırlamaları bilmeli. Bunu yapmak için zaten varolan bir mekanizma istihdam etmek daha akıllıca olacaktır - Ben normal bir ifade kütüphane veya Perl gibi normal ifadeleri kullanma hakkında daha istekli olan bir dil için bu işi verebilir şüpheli; Bu yavaş olabilir, ama yine de kullanıcıların olabilir girişi korkunç yavaş normal ifadeler;: ama @ metodu sonuçta bir fikir çok kötü gibi gelmiyor ve kötü bir uygulama olabilir, ama sizin durumunuzda bu mümkün olan en iyi çözüm gibi görünüyor.
Wikipedia ilgili bazı makaleler:
Ben bu yardımcı umut!