SORU
4 HAZİRAN 2010, Cuma


Etrafa düzenli ifade ile eşleşen olabilir hangi etkiler?

Bu özellik olmadan eşleşen olamazdı diller maç için izin modern bir düzenli ifade motorları bazı özellikleri vardır. Geri başvurular kullanarak maçlar tekerrür bir kelime içeren tüm dizeleri dili örneğin, aşağıdaki normal ifade: (. )\1. Bu dili düzenli değil ve geri başvurular kullanan bir düzenli ifade ile eşleşen olamaz.

Etrafa da bir düzenli ifade ile eşleşen olabilir hangi etkiler? I. e. aksi takdirde uyumlu olamazdı kullanarak etrafa uyumlu herhangi bir dil var mı? Eğer öyleyse, bu bazıları için etrafa tüm tatlar (negatif veya pozitif ilerleme veya geriye ilerleme) ya da sadece doğru mu?

CEVAP
6 HAZİRAN 2010, Pazar


Düzenli diller, düzenli ifadeler etrafa ile artar ile tanınan olabilir daha dil daha büyük bir sınıf olsun, hangi soruyu sorduğunuz sorunun cevabı, hayır.

Bir kanıt nispeten basittir, ama bir normal ifade içine lookarounds içeren olmadan çevirmek için bir algoritma dağınık.

Birincisi: her zaman düzenli ifade (sonlu bir alfabe üzerinde) inkar edebilirsiniz. Verilen bir sonlu durum otomat algılıyor ve dil tarafından oluşturulan ifade, sadece değişimi kabul eden bütün devletler için olmayan kabul Amerika'ya gitmek bir GÖNDERMESİYLE algılıyor ve tam olarak reddeden bu dil, orada bir aile eşdeğer düzenli ifadeler.

İkincisi: çünkü düzenli diller (ve dolayısıyla düzenli ifadeler) kapalı altında olumsuzluk onlar da kapalı altında kesişim beri Bir kesişim B = neg ( neg(A), diğeri negatif(B)) de Morgan yasaları. Başka bir deyişle iki düzenli ifadeler göz önüne alındığında, her iki eşleşen bir düzenli ifade bulabilirsiniz.

Bu, etrafa ifadelerini taklit etmek için izin verir. Örneğin u(?=v)w sadece uv ve uw maç olacak ifadeler maçlar.

Negatif ilerleme için ıntersect (neg B) veya benzer şekilde neg (neg(A) birlik B) sadece Bir\B, teorik olarak ayarlayın düzenli ifade belgeye ihtiyacınız var. S uygun olmayan r eşleşen ifadeler eşleşen düzenli ifadeler için r ve düzenli bir ifade bulabilirsiniz ler r-s böylece. Negatif ilerleme açısından: (?! u v)w uw maç sadece o ifadeler - uv ile eşleşir.

Etrafa yararlı olmasının iki nedeni vardır.

Düzenli ifade yadsınması bir şey çok daha az düzenli neden olabilir, çünkü ilk,. Örneğin q(?!u)=q($|[^u]).

İkinci olarak, düzenli ifadeler daha ifadeler aynı, onlar da bir dizeden karakterleri tüketmek - ya da en azından onlar hakkında düşünmeyi severiz. Python örneğin önemsiyorum .() başlangıç ve .() sonunda, ders, böylece:

>>> re.search('q($|[^u])', 'Iraq!').end()
5
>>> re.search('q(?!u)', 'Iraq!').end()
4

Üçüncü olarak, ve bu çok önemli bir sebebi olduğunu düşünüyorum, düzenli ifadeler yazılabilir güzel birleştirme üzerinde asansör yok. neg(a)neg(b) değil aynı şey gibi negatif(ab), bu da demektir ki sen çeviremiyor bir etrafa dahilinde hangi bulmanızı - işlem bütün dize. Bu insanlarla çalışmak için tatsız hale getirir ve düzenli ifadeler hakkında insanların sezgileri sonları sanırım.

Teorik soru (gece geç, eğer belli ediyorum kusura bakmayın) cevapladım umarım. Bu pratik uygulamalar var mı diyen bir yorumcu ile aynı fikirdeyim. Çok karmaşık bazı web sayfaları kazımak için çalışırken aynı sorunla karşılaştım.

EDİT

Net olmadığı için özür dilerim: düzenli ifadeler düzenli bir kanıtı yapısal indüksiyon tarafından lookarounds verebilirsiniz inanmıyorum, benim u(?!v)w örnek, sadece bir örnek gerekiyordu ve çok kolay. Yapısal bir indüksiyon işe yaramaz sebebi lookarounds olmayan kompozisyon bir şekilde-olumsuz yönleri yukarıda yapmak için çalışıyordu noktası olarak davranır çünkü. Doğrudan herhangi bir resmi kanıt karmaşık ayrıntılar çok olacak sanıyorum. Kolay bir yol göstermek düşünmeye çalıştım ama kafamın üst kapalı bir şey düşün.

^([^a]|(?=..b))*$ Bu Josh'un ilk örneği kullanarak göstermek için bütün devletlerin kabul ile 7 devlet DFSA eşdeğerdir:

A - (a) -> B - (a) -> C --- (a) --------> D 
Λ          |           \                  |
|          (not a)       \               (b)
|          |              \               | 
|          v                \             v
(b)        E - (a) -> F      \-(not(a)--> G  
|            <- (b) - /                   |
|          |                              |
|         (not a)                         |
|          |                              |
|          v                              |
\--------- H <-------------------(b)-----/

Devlet için düzenli ifade Bir yalnız gibi görünüyor:

^(a([^a](ab)*[^a]|a(ab|[^a])*b)b)*$

Diğer bir deyişle lookarounds ortadan kaldırarak almak için gidiyoruz herhangi bir düzenli ifade genel olarak çok daha uzun ve çok daha kirli olacak.

Josh yorum cevap - evet denklik FSA'YA) olduğunu kanıtlamak için en kestirme yol bence. Ne yapar bu messier olan her zamanki şekilde inşa bir KİTLELER üzerinden bir non-deterministik makine - onun için çok daha kolay ifade u|v olarak sadece makine inşa makinaları için u ve v ile bir epsilon geçiş yapmışlar. Elbette bu deterministik bir makine eşdeğerdir, ama üstel riskini havaya Birleşik Devletleri. Oysa olumsuzluk çok daha kolay deterministik bir makine ile yapmak.

Genel prova iki makine kartezyen ürün alıp eklemek istediğiniz her noktada bir etrafa korumak isteyen bu devletleri seçerek içerecektir. Yukarıdaki örnekte, bir dereceye kadar ne demek istediğimi gösterir.

Bir inşaat temini için özür dilerim.

DAHA FAZLA DÜZENLEME: Düzenli ifade lookarounds ile etkisi arttırılmış bir DFA oluşturmak için bir algoritma tanımlayan blog post buldum. Yazar, çünkü onun düzgün NFA-e "etiketli epsilon geçişler" bariz bir şekilde, ve bir DFA böyle bir otomat dönüştürmek için nasıl açıklar. bir fikri genişletir

Bunu yapmanın bir yolu gibi bir şey düşünmüştüm, ama biri yazmış olduğunu sevindim. Beni aşan bir şey bu kadar temiz ile gelip oldu.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Android Developers

    Android Deve

    9 Kasım 2007
  • Living Waters

    Living Water

    9 AĞUSTOS 2006
  • UKF Dubstep

    UKF Dubstep

    29 NİSAN 2009