Düzenli ifadeler, iç içe geçmiş desen eşleşmesi için kullanılabilir mi?
Kat sayısı bilinmeyen oluşan iç içe geçmiş bir desen eşleşen bir düzenli ifade yazmak mümkün. Örneğin, normal ifade bir açılış maçı ve kapanış, açık kapanış parantez dış parantez içinde iç içe bilinmeyen sayıda olduğunda durun.
Örneğin:
public MyMethod()
{
if (test)
{
// More { }
}
// More { }
} // End
Maç:
{
if (test)
{
// More { }
}
// More { }
}
CEVAP
Hayır. O kadar kolay değil. Bir sonlu otomat (veri yapısı, temel bir düzenli ifade) yok hafıza dışında devlet var, ve eğer keyfi olarak iç içe, ihtiyacınız olan bir keyfi büyük otomat, hangi çarpan ile fikri birsonluotomat.
Derinliği robot çok büyük olur, çünkü sadece bellek ile sınırlı, sabit bir derinliğe kadar iç içe/eşleştirilmiş öğeleri maç. Ancak uygulamada, itme-aşağı bir otomat, ben kullanmanız gerekir.e örneği LL (yukarıdan aşağıya) veya LR (aşağıdan yukarıya) için açık kaynak kodlu bir dilbilgisi için bir ayrıştırıcı. Dikkate kötü çalışma zamanı davranışını almak zorundasın: O(n^3) O(n), n = uzunluk(giriş) vs.
Avialable, örneğin ANTLR Java için birçok ayrıştırıcı jeneratör var. Java için varolan bir dilbilgisi (veya C) bulmak da zor değil.< / ^ br . Daha fazla arka plan için: Vikipedi Automata Theory
Düzenli ifade Eşleşmesi için Desen,......
C# kullanarak düzenli ifadeler HTML et...
İç içe geçmiş try blokları önlemek içi...
Düzenli İfadeler Java Değeri Ayıklamak...
Birden çok dilde düzenli ifadeler için...