Perl Uyumlu Normal İfadeler - Perl Compatible Regular Expressions

Perl Uyumlu Normal İfadeler
Orijinal yazar (lar)Philip Hazel
Kararlı sürüm
PCRE 8.44 ve PCRE2 10.35 / 9 Mayıs 2020; 6 ay önce (2020-05-09) [1]
Depo Bunu Vikiveri'de düzenleyin
YazılmışC
İşletim sistemiÇapraz platform
TürDesen eşleştirme kütüphane
LisansBSD
İnternet sitesiwww.pcre.org

Perl Uyumlu Normal İfadeler (PCRE) bir kütüphane yazılmış C, uygulayan Düzenli ifade motorun yeteneklerinden esinlenerek Perl programlama dili. Philip Hazel 1997 yazında PCRE yazmaya başladı [2]. PCRE'nin sözdizimi, her ikisinden de çok daha güçlü ve esnektir. POSIX normal ifadesi tatlar (BRE, ERE) [3] ve diğer birçok normal ifade kitaplığından daha fazla.

PCRE başlangıçta Perl ile öznitelik denkliğini amaçlasa da, iki uygulama tam olarak eşdeğer değildir. PCRE 7.x ve Perl 5.9.x aşaması sırasında, iki proje geliştirmeyi koordine etti ve özellikler her iki yönde de taşındı. [4]

2015 yılında, revize edilmiş programlama arayüzü (API) ile bir çatal PCRE piyasaya sürüldü. Şimdi PCRE1 (8.xx serisi) olarak adlandırılan orijinal yazılımda hatalar giderildi, ancak daha fazla geliştirme yapılmadı. Artık (2020) modası geçmiş olarak kabul edilmektedir ve mevcut 8.44 sürümü muhtemelen sonuncusu olacaktır. Yeni PCRE2 kodu (10.xx serisi) bir dizi uzantıya ve kodlama geliştirmesine sahiptir ve geliştirmenin gerçekleştiği yerdir.

Bir dizi önemli açık kaynaklı programlar, benzeri Apaçi ve Nginx HTTP sunucuları ve PHP ve R komut dosyası dilleri, PCRE kitaplığını içerir; Kütüphane BSD lisanslı olduğu için özel mülk yazılım da aynı şekilde yapabilir. Perl 5.10'dan itibaren, PCRE, Perl'in varsayılan düzenli ifade motorunun yerine de kullanılabilir. re :: engine :: PCRE modül.

Kitaplık Unix, Windows ve diğer birçok ortamda oluşturulabilir. PCRE2, bir POSIX C sarıcı ile dağıtılır [Not 1], birkaç test programı ve kitaplıkla birlikte oluşturulmuş "pcre2grep" yardımcı programı.



Özellikleri

Tam zamanında derleyici destek

Bu isteğe bağlı özellik, PCRE2 kitaplığı oluşturulduğunda etkinleştirilirse kullanılabilir. Çağıran program, tekrar tekrar yürütülen uyumlu modellerle özelliği kullandığında (örneğin) büyük performans yararları mümkündür. Tam zamanında derleyici desteği Zoltan Herczeg tarafından yazılmıştır ve POSIX sarmalayıcısında ele alınmamıştır.


Esnek bellek yönetimi

Geri izleme için sistem yığınının kullanılması PCRE1'de sorunlu olabilir, bu nedenle uygulamanın bu özelliği PCRE2'de değiştirilmiştir. Yığın artık bu amaç için kullanılmaktadır ve toplam miktar sınırlandırılabilir. Sorunu yığın taşması PCRE1 ile düzenli olarak ortaya çıkan, artık 10.30 (2017) sürümünden itibaren PCRE2 ile ilgili bir sorun değildir.


Tutarlı çıkış kuralları

Perl gibi, PCRE2 de tutarlı kaçış kurallarına sahiptir: alfa-sayısal olmayan herhangi bir karakter, değişmez değerini ifade etmek için bir önek ile ön eklenebilir. \ (ters eğik çizgi) karakterden önce. Önünde ters eğik çizgi bulunan herhangi bir alfa sayısal karakter tipik olarak ona özel bir anlam verir. Sıranın özel olarak tanımlanmadığı durumda bir hata oluşur. Bu, yalnızca uyarı modundaysa hata veren Perl'den farklıdır (PCRE2'de uyarı modu yoktur). POSIX normal ifadelerinde, bazen ters eğik çizgiler alfa sayısal olmayanlardan kaçtı (ör. \.) ve bazen özel bir özellik sundular (ör. \(\)).


Genişletilmiş karakter sınıfları

Tek harf karakter sınıfları daha uzun POSIX adlarına ek olarak desteklenir. Örneğin, d herhangi bir rakamla tam olarak eşleşir [[:hane:]] POSIX normal ifadelerinde olur.


Minimum eşleşme (a.k.a. "çaresiz")

Bir ? en kısa eşleşmenin kullanılması gerektiğini belirtmek için herhangi bir tekrar nicelik belirtecinden sonra yerleştirilebilir. Varsayılan, en uzun maç ilk ve daha kısa eşleşmelerde geriye doğru izleme: ör. a. *? b "ababab" içindeki "ab" ile eşleşir, burada a. * b dizenin tamamıyla eşleşir.


Unicode karakter özellikleri

Unicode her karakter için birkaç özellik tanımlar. PCRE2'deki modeller şu özelliklerle eşleşebilir: ör. \p{Ps}.*?\p{Pe} herhangi bir "açılış noktalama" ile başlayan ve herhangi bir "yakın noktalama" ile biten bir dizeyle eşleşir: [ABC]. Bazı "normal" metakarakterlerin eşleşmesi, derleme seçeneği PCRE2_UCP ayarlandığında Unicode özellikleri tarafından yönlendirilebilir. Seçenek dahil edilerek bir model için ayarlanabilir (* UCP) desenin başlangıcında. Seçenek, aşağıdaki meta karakterlerin davranışını değiştirir: B, b, D, d, S, s, W, wve bazı POSIX karakter sınıfları. Örneğin, ile eşleşen karakter kümesi w (kelime karakterleri), Unicode özellikleriyle tanımlanan harfleri ve aksanlı harfleri içerecek şekilde genişletilir. Bu tür eşleştirme normalden daha yavaştır (ASCII -yalnızca) UCP olmayan alternatif. UCP seçeneğinin, kitaplığın Unicode desteğini içerecek şekilde oluşturulmasını gerektirdiğini unutmayın (bu, PCRE2 için varsayılandır). PCRE1'in çok eski sürümleri yalnızca ASCII kodunu destekliyordu. Daha sonra UTF-8 desteği eklendi. 8.30 sürümünde UTF-16 desteği ve 8.32 sürümünde UTF-32 desteği eklenmiştir. PCRE2 her zaman üç UTF kodlamasını da desteklemiştir.


Çok satırlı eşleştirme

^ ve $ hangi seçeneklerin ayarlandığına bağlı olarak yalnızca bir dizenin başında ve sonunda veya dizedeki her "satırın" başında ve sonunda eşleşebilir.


Yeni satır / satır sonu seçenekleri

PCRE derlendiğinde, yeni satır varsayılanı seçilir. Hangi satırsonu / satır sonu, PCRE'nin tespit ettiği yeri etkiler ^ satır başlangıcı ve $ (çok satırlı modda) ve nokta ile neyin eşleştiğinin (çok satırlı moddan bağımsız olarak, dotall seçeneği yoksa (? s) ayarlanır). PCRE eşleştirme prosedürünü de etkiler (sürüm 7.0'dan beri): bağlanmamış bir model bir satırsonu dizisinin başlangıcında eşleşmede başarısız olduğunda, PCRE eşleşmeyi yeniden denemeden önce tüm satırsonu dizisini geçer. Yeni satır seçeneği alternatifi, geçerli satır kesmelerinden biri olarak CRLF içeriyorsa, n bir CRLF'de, model belirli bir r veya n referanslar (7.3 sürümünden beri). 8.10 sürümünden bu yana, meta karakter N her zaman satır sonu karakterleri dışındaki herhangi bir karakterle eşleşir. Aynı davranışa sahiptir . dotall seçeneği aka (? s) yürürlükte değil.


Yeni satır seçeneği, bir desen derlendiğinde ve çalıştırıldığında harici seçeneklerle değiştirilebilir. PCRE kullanan çok az uygulama, kullanıcılara bu ayarı harici bir seçenek aracılığıyla uygulama imkanı sağlar. Dolayısıyla, satırsonu seçeneği aşağıdakilerden biri kullanılarak desenin başlangıcında da belirtilebilir:

  • (* LF) Newline, bir satır besleme karakteridir.

    Karşılık gelen satır sonları ile eşleştirilebilir n.
  • (* CR) Newline bir satır başıdır.

    Karşılık gelen satır sonları ile eşleştirilebilir r.
  • (* CRLF) Yeni satır / satır sonu bir satır başı ve ardından satır beslemedir.

    Karşılık gelen satır sonları ile eşleştirilebilir r n.
  • (* ANYCRLF) Verilerde karşılaşılan yukarıdakilerden herhangi biri satırsonu işlemeyi tetikleyecektir.

    Karşılık gelen satır sonları ile eşleştirilebilir (?:\r\n?|\n) veya ile R.

    Ters eğik çizgi-R ile neyin eşleştiğine ilişkin yapılandırma ve seçenekler için aşağıya bakın.

  • (*HİÇ) Yukarıdakilerden herhangi biri artı özel Unicode satır sonu.

    UTF-8 modunda olmadığında, karşılık gelen satır sonları ile eşleştirilebilir (?:\r\n?|\n|\x0B|\f|\x85) [Not 2] veya R.

    UTF-8 modunda, iki ek karakter satır sonları olarak tanınır: (*HİÇ):

    • LS (satır ayırıcı, U + 2028),
    • PS (paragraf ayırıcı, U + 2029).

    Windows'ta, Unicode olmayan verilerde, HİÇ linebreak karakterlerinin başka anlamları vardır.

    Örneğin, x85 yatay bir üç nokta ile eşleşebilir ve eğer karşılaşılırsa HİÇ yeni satır yürürlükteyse, satırsonu işlemeyi tetikler.

    Ters eğik çizgi-R ile neyin eşleştiğine ilişkin yapılandırma ve seçenekler için aşağıya bakın.


Ters eğik çizgi-R seçenekleri

PCRE derlendiğinde, neyin eşleştiği için bir varsayılan seçilir R. Varsayılan, ANYCRLF'ye karşılık gelen veya ANY'ye karşılık gelen satır bölümleriyle eşleşecek şekilde olabilir. Varsayılan, gerektiğinde dahil edilerek geçersiz kılınabilir (* BSR_UNICODE) veya (* BSR_ANYCRLF) modelin başında. Sağlarken (* BSR ..) seçeneği, ayrıca şunları da sağlayabilirsiniz: (*Yeni hat) seçenek, ör. (* BSR_UNICODE) (* HERHANGİ BİR)kalıbın geri kalanı. Ters eğik çizgi-R seçenekleri, bir model derlendiğinde PCRE2'yi çağıran uygulama tarafından harici seçeneklerle de değiştirilebilir.


Desen seçeneklerinin başlangıcı

Satır kırma seçenekleri, örneğin (* LF) yukarıda belgelenmiştir; ters eğik çizgi-R seçenekleri, örneğin (* BSR_ANYCRLF) yukarıda belgelenmiştir; Unicode Karakter Özellikleri seçeneği (* UCP) yukarıda belgelenmiştir; (* UTF8) seçenek aşağıdaki gibi belgelenmiştir: PCRE2 kitaplığınız ile derlenmişse UTF destek, belirtebilirsiniz (* UTF) UTF-8, UTF-16 veya UTF-32 modunu çağırmak için harici bir seçenek ayarlamak yerine kalıbın başlangıcında seçenek.


Geri referanslar

Bir kalıp, önceki bir maçın sonuçlarına geri dönebilir. Örneğin, (a | b) c 1 "aca" veya "bcb" ile eşleşir ve örneğin "acb" ile eşleşmez.


Adlandırılmış alt şablonlar

Bir alt model (parantez içinde, örneğin (...)) bir lider eklenerek adlandırılabilir ? P açılış ebeveyninden sonra. Adlandırılmış alt modeller, PCRE'nin benimsediği bir özelliktir. Python düzenli ifadeler.

Bu özellik daha sonra Perl tarafından benimsenmiştir, bu nedenle artık adlandırılmış gruplar kullanılarak da tanımlanabilir. (? ...) veya (? 'isim' ...), Hem de (? P ...). Adlandırılmış gruplara geri referans verilebilir, örneğin: (? P = isim) (Python sözdizimi) veya k'name ' (Perl sözdizimi).


Altyordamlar

Bir geri başvuru, öznenin daha önce bir alt modelle eşleşen kısmına atıfta bulunmak için bir mekanizma sağlarken, bir alt yordam, daha önce tanımlanmış bir alt modeli yeniden kullanmak için bir mekanizma sağlar. Alt şablonun, büyük / küçük harf bağımsızlığı gibi seçenekleri, alt şablon tanımlandığında sabitlenir. (a.c) (? 1) geri referans kullanılırken "aacabc" veya "abcadc" ile eşleşir (a.c) 1 olmaz, ancak her ikisi de "aacaac" veya "abcabc" ile eşleşir. PCRE ayrıca Perl olmayan bir Oniguruma alt programlar için inşa edin. Kullanılarak belirtilirler g veya g .


Atomik gruplama

Atomik gruplama, geri izleme bir düzende. Örneğin, a ++ bc olabildiğince çok "a" ile eşleşecek ve bir daha azını denemek için asla yedeklenmeyecektir.


İleriye bakma ve arkaya bakma iddiaları

İddiaArkana bakÖnden Bakış
Pozitif(?<=Desen)(?=Desen)
Olumsuz(?<!Desen)(?!Desen)
Geriye bakış ve ileriye dönük iddialar
içinde Perl düzenli ifadeler

Desenler, önceki metnin veya sonraki metnin, eşleşen metni tüketmeden bir desen içerdiğini iddia edebilir (sıfır genişlik iddiası). Örneğin, / w + (? = t)/ bir kelimeyi takip eden a ile eşleşir sekme, sekmenin kendisini dahil etmeden.

Geriye dönük iddialar belirsiz uzunlukta olamaz, ancak (Perl'den farklı olarak) her dal farklı bir sabit uzunlukta olabilir.

K mevcut tüm maçın başlangıcını sıfırlamak için bir modelde kullanılabilir. Bu, geriye dönük iddialara esnek bir alternatif yaklaşım sağlar çünkü maçın atılan kısmı (önceki kısım) K) uzunluğunun sabitlenmesine gerek yoktur.


Sıfır genişlikli iddialar için kaçış dizileri

Örneğin. b sıfır genişlikli "kelime sınırları" ile eşleştirmek için (?<=\W)(?=\w)|(?<=\w)(?=\W)|^|$.


Yorumlar

Bir yorum şununla başlar: (?# ve sonraki kapanış parantezinde biter.


Yinelemeli desenler

Bir örüntü, özyinelemeli olarak kendisine veya herhangi bir alt kalıba başvurabilir. Örneğin, desen \((a*|(?R))*\) herhangi bir dengeli parantez ve "a" kombinasyonuyla eşleşir.


Genel belirtme çizgileri

PCRE ifadeleri gömülebilir (? C''n ''), nerede n bir sayıdır. Bu, PCRE API aracılığıyla harici bir kullanıcı tanımlı işlevi çağırır ve rastgele kodu bir modele gömmek için kullanılabilir.



Perl'den farklılıklar

PCRE2 ve Perl arasındaki farklar (Perl 5.9.4 itibariyle) aşağıdakileri içerir, ancak bunlarla sınırlı değildir: [5]

  • 10.30 sürümüne kadar yinelemeli eşleşmeler PCRE'de atomikti ve Perl'de atomik değildi.:

    Bu şu anlama geliyordu "<<!>!>!>><>>!>!>!>" =~ /^(<(?:[^<>]+|(?3)|(?1))*>)()(!>!>!>)$/ Perl'de eşleşecek, ancak 10.30 sürümüne kadar PCRE2'de eşleşmeyecektir.


  • Bir yakalama arabelleğinin değeri ? nicelik belirteci (1 veya 0 kez eşleştirin) başka bir ölçülen yakalama arabelleğine yerleştirildiğinde farklıdır:

    Perl'de "aba" =~ / ^ (a (b)?) + $ /; sonuçlanacak $1 "a" içeren ve $2 kapsamak undef, ancak PCRE'de sonuçlanır $2 "b" içeren.


  • PCRE, adlandırılmış yakalama tamponlarına sayısal isimler verilmesine izin verir; Perl, adın barewords kuralına uymasını gerektirir:

    Bu şu demek g {} Perl'de belirsizdir, ancak PCRE'de potansiyel olarak belirsizdir.

    Bu artık grup adlarının bir rakamla başlamasına izin vermeyen PCRE 8.34'ten (2013-12-15'te piyasaya sürüldü) beri bir fark değil. [6]


  • PCRE, arkadaki alternatiflerin farklı uzunluklarda olmasına izin verir:

    Geriye bakma iddiaları içinde, hem PCRE hem de Perl sabit uzunlukta desenler gerektirir.

    Yani, hem PCRE hem de Perl değişken uzunluklu kalıplara izin vermez.


    Bununla birlikte, Perl, arkaya bakma iddiasının tüm alternatif dallarının birbirleriyle aynı uzunlukta olmasını gerektirirken, PCRE bu alternatif dalların, her dalın sabit bir uzunluğa sahip olduğu sürece birbirinden farklı uzunluklara sahip olmasına izin verir.


  • PCRE belirli "deneysel" Perl yapılarını desteklemez:

    Gibi (??{...}) (dönüşü modelin bir parçası olarak değerlendirilen bir geri arama) ne de (?{}) yapı, ancak ikincisi kullanılarak taklit edilebilir (? Cn).

    Perl 5.9.x serisine eklenen özyineleme kontrol fiilleri de desteklenmez.


    Deneysel geri izleme kontrol fiilleri desteği (Perl 5.10'da eklenmiştir), sürüm 7.3'ten beri PCRE'de mevcuttur.

    Onlar (*BAŞARISIZ), (* F), (*KURU ERİK), (* ATLA), (*SONRA), (* COMMIT), ve (*KABUL ETMEK).


    Perl'in geriye dönük kontrol fiillerine karşılık gelen argüman kullanımı genellikle desteklenmez.

    Bununla birlikte, sürüm 8.10'dan beri, PCRE'nin aşağıdaki fiilleri belirli bir bağımsız değişkenle desteklediğini unutmayın: (* MARK: markName), (* SKIP: markName), (* PRUNE: markName), ve (* SONRA: markName).


    Sürüm 10.32 PCRE2 desteklediğinden beri (* KABUL: markName), (* FAIL: markName), ve (* COMMIT: markName).


  • PCRE ve Perl, hatalı yapılara toleranslarında biraz farklıdır:

    Perl, niceleyicilere (?!...) anlamsız ama zararsız (verimsiz de olsa) inşa; PCRE, 8.13'ten önceki sürümlerde bir hata üretir.


  • PCRE'nin özyineleme derinliğinde kesin bir sınırı vardır, Perl:

    Varsayılan derleme seçenekleriyle "bbbbXcXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" =~ /.X(.+)+X/ limit nedeniyle eşleşmeyecektir, ancak Perl bunu doğru şekilde eşleştirecektir.

    Perl, özyineleme için öbek kullanır ve özyineleme derinliği için sabit bir sınıra sahip değildir, oysa PCRE2, çağıran uygulama tarafından yukarı veya aşağı ayarlanabilen bir derleme zamanı varsayılan sınırına sahiptir.


Yukarıdaki noktalar haricinde, PCRE testleri Perl'de geçebilir "t / op / re_tests"dosya, Perl'in düzenli ifade motoru için ana sözdizimi düzeyinde regresyon testlerinden biridir.



Notlar ve referanslar

Notlar

  1. ^ Çekirdek PCRE2 kitaplığı hem eşleştirme hem de eşleştirme ve değiştirme işlevi sağlar.
  2. ^ Elbette \x85 parçası değil \xC2\x85? (yani (?:\r\n?|\n|\x0B|\f|\xC2\x85), gibi U + 0085 ! = 0x85)

    Uyarı: Eğer desen \xC2\x85 çalışamadı: RegEx uygulamasının Unicode ayarlarını deneyin veya aşağıdakilerle değiştirmeyi deneyin:
    • \x{0085}
    • \u0085


Referanslar

  1. ^
  2. ^
    • Exim ve PCRE: Özgür yazılım hayatımı nasıl ele geçirdi (1999-12) Philip Hazel: https://www.ukuug.org/events/winter99/proc/PH.ps

      PCRE ne olacak?

      • 1997 yazında yazılmıştır, ftp sitesine yerleştirilmiştir.
      • İnsanlar onu buldu ve bir posta listesi başlattı.
      • Bir dizi iyileştirme oldu.
        - Exim ve PCRE: Özgür yazılım hayatımı nasıl ele geçirdi, Sf. 7
  3. ^
  4. ^
  5. ^
  6. ^
  7. ^



Ayrıca bakınız


Dış bağlantılar

Cambridge Üniversitesi Bilgi İşlem Hizmeti (CSX )