SORU
15 EYLÜL 2011, PERŞEMBE


Maç^n b^n c^n (örneğin "aaabbbccc") düzenli ifadeler (/)kullanarak

Modern düzenli ifade uygulamaları (en önemlisi) / regular grammars orijinal kavramı ile ortak noktaları çok az bilinen bir gerçektir. Örneğin context-free grammar bir klasik örnek ayrıştırabilir {birnbn; n>0} (*3 örneğin*) bu normal ifadenin (**20) kullanarak:

~^(a(?1)?b)$~

Sorum şu: Ne kadar ileri gidebilirsin? Ayrıca context-sensitive grammar ayrıştırmak için olası {birnbncn;n>0} (*örneğin 5*)/? kullanarak

CEVAP
15 EYLÜL 2011, PERŞEMBE


NullUserExceptions esinlenerek cevap diye bir dava için başarısız olarak zaten silinmiş olan) Ben bir çözüm buldum sanırım kendi kendime

$regex = '~^
    (?=(a(?-1)?b)c)
     a (b(?-1)?c)
$~x';

var_dump(preg_match($regex, 'aabbcc'));    // 1
var_dump(preg_match($regex, 'aaabbbccc')); // 1
var_dump(preg_match($regex, 'aaabbbcc'));  // 0
var_dump(preg_match($regex, 'aaaccc'));    // 0
var_dump(preg_match($regex, 'aabcc'));     // 0
var_dump(preg_match($regex, 'abbcc'));     // 0

Kendiniz deneyin: http://codepad.viper-7.com/1erq9v


Açıklama

Eğer pozitif ileri yönlü onaylama işlemi ((?=...) parçası olmadan düzenli göz önüne alırsak, bu var:

~^a (b(?-1)?c)$~

Bu as bs cs eşit sayıda izledi rasgele bir numara olmadığını kontrol etmekten başka bir şey yapmaz.

Bu henüz as sayısı aynı olmalı çünkü bizim dilbilgisi tatmin etmiyor. as sayısı bs sayısı eşit olduğunu kontrol ederek emin olabilirsiniz. Ve bu ileri yönlü onaylama ifadesi ne yapar: (a(?-1)?b)c. c bs parçası maç yapmıyoruz bu yüzden gereklidir.


Sonuç

Bu modern tek düzenli olmayan düzenli gramerleri ayrıştırma yeteneğine sahip olduğunu etkileyici bir şekilde gösteriyor, ama bile olmayan bir bağlam-ücretsiz gramer ayrıştırabilir bence. Bu sonsuz tekrarlama dinlenmeye umarız "X düzenli olmadığı için düzenli ifade ile X yapamazsın"

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Amena

    Amena

    15 Kasım 2006
  • Android Central

    Android Cent

    13 Kasım 2008
  • hidetake takayama

    hidetake tak

    3 Mart 2009