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

  • Facebook Developers

    Facebook Dev

    24 ŞUBAT 2009
  • TSE

    TSE

    12 Kasım 2012
  • Tube Time

    Tube Time

    14 Mayıs 2013