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

  • Jeb Corliss

    Jeb Corliss

    17 Kasım 2006
  • TheMasterOfHell100

    TheMasterOfH

    13 AĞUSTOS 2011
  • TotalSeminarsChannel

    TotalSeminar

    16 Mart 2010