Sakar reg comp php. Man regcomp(3): POSIX düzenli ifade işlevleri

> int regcomp(regex_t * hamile, sabit karakter *normal ifade, dahili bayraklar); int regexec(const regex_t *hamile, sabit karakter *sicim, size_t eşleşme, regmatch_t pmatch, dahili bayraklar); size_t regerror(int) hata kodu, const regex_t *hamile, karakter *hata, size_t errbuf_size); geçersiz regfree(regex_t *hamile);

Tanım

POSIX normal ifade derlemesi düzenli düzenleme() düzenli bir ifadeyi sonraki işlemlere uygun bir biçimde derlemek için kullanılır. normal ifade()arama yapar.

düzenli düzenleme() ile birlikte verilir hamile bir model arabellek depolama alanına işaret eden bir işaretçi; normal ifade, boş sonlandırılmış dizeye bir işaretçi ve bayraklar derleme türünü belirlemek için kullanılan bayraklar.

Tüm düzenli ifade aramalarının derlenmiş bir kalıp arabelleği aracılığıyla yapılması gerekir; bu nedenle normal ifade() her zaman bir adresin adresiyle birlikte sağlanmalıdır. düzenli düzenleme() başlatılmış desen arabelleği.

bayraklar bit düzeyinde olabilir veya aşağıdakilerden bir veya daha fazlasından: REG_EXTENDED Kullanmak POSIX Yorumlama sırasında Genişletilmiş Normal İfade sözdizimi normal ifade. Ayarlanmadıysa POSIX Temel Normal İfade sözdizimi kullanılır. REG_ICASE Durum ayrımı yapmayın. Sonraki normal ifade() bu kalıp arabelleğini kullanan aramalar büyük/küçük harfe duyarlı olmayacaktır. REG_NOSUB Maçların konumunu bildirme. eşleşme Ve pmatch argümanlar normal ifade() sağlanan desen arabelleği bu bayrak kümesiyle derlendiyse göz ardı edilir. REG_NEWLINE Herhangi bir karakterle eşleşme operatörleri yeni satırla eşleşmez.

Eşleşmeyen bir liste ( [^...] ) yeni satır içermeyen bir satırsonu ile eşleşmez.

Satır başı eşleştirme operatörü ( ^ ), yeni satır olup olmadığına bakılmaksızın, yeni satırdan hemen sonra boş dizeyle eşleşir. bayraklar, yürütme bayrakları normal ifade(), içerir REG_NOTBOL.

Satır sonu eşleştirme operatörü ( $ ), yeni satır olup olmadığına bakılmaksızın, yeni satırdan hemen önceki boş dizeyle eşleşir. bayraklar içerir REG_NOTEOL.

POSIX normal ifade eşleştirmesi normal ifade() boş sonlandırılmış bir dizeyi önceden derlenmiş desen arabelleğiyle eşleştirmek için kullanılır, hamile. eşleşme Ve pmatch herhangi bir eşleşmenin konumu hakkında bilgi sağlamak için kullanılır. bayraklar bit düzeyinde olabilir veya birinden veya her ikisinden REG_NOTBOL Ve REG_NOTEOL aşağıda açıklanan eşleştirme davranışında değişikliklere neden olur. REG_NOTBOL Satır başlangıcını eşleştirme operatörü her zaman eşleşmede başarısız olur (ancak derleme bayrağına bakın) REG_NEWLINE yukarıda) Bu bayrak, bir dizenin farklı bölümleri aktarıldığında kullanılabilir. normal ifade() ve dizenin başlangıcı, satırın başlangıcı olarak yorumlanmamalıdır. REG_NOTEOL Satır sonu eşleştirme operatörü her zaman eşleşmede başarısız olur (ancak derleme bayrağına bakın) REG_NEWLINEüstünde)

Bayt ofsetleri Meğer ki REG_NOSUB Desen arabelleğinin derlenmesi için ayarlandığında, eşleşme adresleme bilgilerinin elde edilmesi mümkündür. pmatch en azından sahip olacak şekilde boyutlandırılmalıdır eşleşme elementler. Bunlar tarafından doldurulur normal ifade() alt dize eşleşme adresleriyle. Alt ifadenin başlangıç ​​konumları Ben açık parantez içinde saklanır pmatch[i]. Normal ifadenin eşleşme adreslerinin tamamı şurada saklanır: pmatch. (Ofsetleri döndürmek için unutmayın N alt ifade eşleşmeleri, eşleşme en azından olmalı N+1.) Kullanılmayan yapı elemanları -1 değerini içerecektir.

regmatch_t türü olan yapı pmatchşurada tanımlanır .

Typedef struct ( regoff_t rm_so; regoff_t rm_eo; ) regmatch_t; Her biri rm_so-1 olmayan öğe, dize içindeki bir sonraki en büyük alt dize eşleşmesinin başlangıç ​​uzaklığını gösterir. Göreceli rm_eoöğesi, eşleşen metinden sonraki ilk karakterin uzaklığı olan eşleşmenin bitiş uzaklığını belirtir.

POSIX hata raporlaması yeniden hata() her ikisinden de döndürülebilecek hata kodlarını çevirmek için kullanılır. düzenli düzenleme() Ve normal ifade() hata mesajı dizelerine.

yeniden hata() hata kodunu iletti, hata kodu desen arabelleği, hamile, karakter dizisi arabelleğine yönelik bir işaretçi, hata ve dize arabelleğinin boyutu, errbuf_size. Boyutunu döndürür hata boş sonlandırılmış hata mesajı dizesini içermesi gerekir. İkisi de olursa hata Ve errbuf_size sıfır olmayanlar, hata ilki doldurulur errbuf_size - 1 hata mesajının karakterleri ve sonlandırıcı bir boş bayt ("\0").

POSIX desen arabelleğini serbest bırakma Tedarik kayıtsız() önceden derlenmiş bir model arabelleğiyle, hamile derleme işlemi tarafından kalıp arabelleğine ayrılan belleği serbest bırakacak, düzenli düzenleme().

Geri dönüş değeri

düzenli düzenleme() başarılı bir derleme için sıfırı veya başarısızlık durumunda bir hata kodunu döndürür.

normal ifade() başarılı bir eşleşme için sıfır döndürür veya REG_NOMATCH başarısızlık için.

Hatalar

Aşağıdaki hatalar şu şekilde döndürülebilir: düzenli düzenleme(): REG_BADBR Geri referans operatörünün geçersiz kullanımı. REG_BADPAT Grup veya liste gibi kalıp operatörlerinin geçersiz kullanımı. REG_BADRPTİlk karakter olarak "*" kullanılması gibi tekrarlama operatörlerinin geçersiz kullanımı. REG_EBRACE Eşleşmeyen ayraç aralığı operatörleri. REG_EBRACK Eşleşmeyen parantez listesi işleçleri. REG_ECOLLATE Geçersiz harmanlama öğesi. REG_ECTYPE Bilinmeyen karakter sınıfı adı. REG_EEND Spesifik olmayan hata. Bu POSIX.2 tarafından tanımlanmamıştır. REG_EESCAPE Sondaki ters eğik çizgi. REG_EPAREN Eşleşmeyen parantez grubu operatörleri. REG_ERANGE Aralık operatörünün geçersiz kullanımı; örneğin aralığın bitiş noktasının başlangıç ​​noktasından önce oluşması. REG_ESIZE Derlenmiş normal ifade, 64Kb'den büyük bir desen arabelleği gerektirir. Bu POSIX.2 tarafından tanımlanmamıştır. REG_ESPACE Normal ifade rutinlerinin belleği tükendi. REG_ESUBREG Bir alt ifadeye geçersiz geri başvuru.

C/C++'da normal ifadelerle çalışmak için regex.h kitaplığı oluşturulmuştur. Ana işlevleri önceden belirler:

#katmak int regcomp (regex_t *restrict preg, const char *restrict modeli, int cflags); int regexec (const regex_t *restrict preg, const char *restrict dize, size_t nmatch, regmatch_t pmatch, int eflags); void regfree (regex_t *preg); size_t regerror (int errcode, const regex_t *restrict preg, char *restrict errbuf, size_t errbuf_size);

İşlev düzenli düzenleme düzenli bir ifadeyi derlemek için tasarlanmıştır. Bu işlev, cflag'ler verilen düzenli ifade modelini derler ve onu bir preg yapısına yerleştirir.
Bayraklar bit düzeyinde veya aşağıdaki öğelerden oluşturulabilir:

  • REG_EXTENDED - genişletilmiş normal ifadeler kullan
  • REG_ICASE - bir dizeyi normal ifadeyle eşleştirirken büyük ve küçük harfler arasında ayrım yapmayın

İşlev normal ifade derlenmiş ve preg yapısına yerleştirilmiş bir normal ifadeyi dize dizesiyle eşleştirir. Bu durumda karşılaştırma başarılı olursa sıfır değeri döndürülür, aksi halde hata kodu döndürülür. Eflags argümanı REG_NOTBOL ve REG_NOTEOL'un bit düzeyinde VEYA'sıdır. Zincir sınırlarının hat sınırları olup olmadığını belirler (^ ve $ mandallarını yönetmek için). Nmatch argümanı sıfırsa, pmatch göz ardı edilir, aksi takdirde alt dize uzaklıkları ile doldurulacak olan nmatch öğeleri dizisine işaret etmesi gerekir.

Hataların şifresini çözmek için işlevi kullanın Regerror(). Normal ifadeyi ve dizeyi eşleştirerek döndürülen hata kodunu dönüştürür ve hata dizesi değerini, boyutunu belirterek errbuf değişkenine yerleştirir.

İşlev regfree() düzenli ifadeyi derlerken istenen belleği boşaltır. Bundan sonra normal ifade yapısına yönelik bir işaretçi kullanılamaz...

Bir örneğe bakalım:

#katmak #katmak ad alanı std'sini kullanma; #define PATTERN "^(0,3).(0,3).(0,3).(0,3)$" #define STRING "127.0.0.1" int main() ( regex_t preg; int err,regerr ; err = regcomp (&preg, PATTERN, REG_EXTENDED); if (err != 0) ( char buff; regerror(err, &preg, buff, sizeof(buff)); cout<< buff; } regmatch_t pm; regerr = regexec (&preg, STRING, 0, &pm, 0); if (regerr == 0) cout << "true"; else { cout << "false\n"; char errbuf; regerror(regerr, &preg, errbuf, sizeof(errbuf)); cout << errbuf; } return 0; }

Bu işlev, IP adresi tanıma için en basit işlevdir. Define yönergesini kullanarak, düzenli ifade içeren bir dizeyi ve kontrol edilecek bir dizeyi önceden tanımladık. Ana fonksiyonda, PATTERN düzenli ifadesi ilk olarak derlenir ve bir preg yapısına yerleştirilir. Hataları anında kontrol ediyoruz ve varsa ekranda gösteriyoruz. Bundan sonra STRING dizesini preg'deki normal ifadeyle karşılaştırırız. Bir eşleşme varsa, "doğru", aksi halde "yanlış" çıktısını alırız ve regerror kullanarak hatayı çözeriz.

Biçim

#katmak int regcomp(regex_t *_restrict_ hamile, const char *_restrict_ model, dahili bayraklar);

Genel açıklama

Tarafından belirtilen normal ifadeyi derler model yürütülebilir bir işlem kodu dizisine dönüştürür.

hamile derlenmiş bir düzenli ifadenin işaretçisidir.

model bir kaynak düzenli ifadeyi (aşağıda açıklanmıştır) tanımlayan bir karakter dizisine yönelik bir işaretçidir.

bayraklar derleme işleminin yapılandırılabilir niteliklerini tanımlayan bir bit bayrağıdır: REG_EXTENDED Genişletilmiş düzenli ifadeleri destekler. REG_ICASE Eşleşmede büyük/küçük harf dikkate alınmaz. REG_NEWLINE Yeni satır karakterine ilişkin her türlü özel önemi ortadan kaldırın. REG_NOSUB Regexec()'te yalnızca başarı veya başarısızlığı raporlayın, yani normal bir ifadenin sözdizimini doğrulayın. Bu bayrak ayarlanırsa regcomp() işlevi ayarlanır re_nsub bulunan parantez içindeki alt ifadelerin sayısına göre model. Aksi halde alt ifade hatayla sonuçlanır.

z/OS XL C/C++ altındaki regcomp() işlevi, geçerli LC_SYNTAX kategorisine göre karakter tanımını kullanacaktır. Karakterler, [ , ] , ( , ) , | , ^ ve $ , farklı kodlanmış karakter kümelerinde değişen kod noktalarına sahiptir.

Düzenli ifadeler

regcomp(), regerror(), regexec() ve regfree() işlevleri, UNIX awk, ed, grep ve egrep komutlarına benzer şekilde normal ifadeler kullanır.

Düzenli ifadenin en basit biçimi, özel bir anlamı olmayan bir karakter dizisidir. Aşağıdaki karakterlerin özel anlamları vardır; genişletilmiş düzenli ifadeler oluşturmak için kullanılırlar: Sembol Tanım. Nokta sembolü, terminal yeni satır karakteri dışında herhangi bir karakterle eşleşir. [ karakterkarakter] Köşeli parantez içindeki kısa çizgi sembolü “içinden” anlamına gelir. Aradaki karakterleri geçerli harmanlama sırasına göre doldurur. Örneğin, eşdeğer olabilir veya farklı bir harmanlama sırası ile eşdeğer olabilir. [ sicim] Köşeli parantez içindeki bir dize, içindeki karakterlerden herhangi birini belirtir. sicim. Bu nedenle, diğer dizelerle karşılaştırıldığında a, b veya c'yi içeren herhangi bir dizeyle eşleşir.

Derleme zamanında aralıkta bulunan gerçek karakterler hakkında hiçbir varsayımda bulunulmaz.

{M} {M,} {M,sen) () içindeki tamsayı değerleri, önceki normal ifadenin kaç kez uygulanacağını gösterir. M minimum sayıdır ve sen maksimum sayıdır. sen RE_DUP_MAX'tan büyük olmamalıdır (bkz. limitler.h).

Yalnızca belirtirseniz M, normal ifadenin tam olarak kaç kez uygulanacağını gösterir. ( M,) eşittir ( sen, ben). Her ikisi de ifadenin m veya daha fazla tekrarıyla eşleşiyor.

* Yıldız işareti herhangi bir karakterin 0 veya daha fazlasını belirtir. Örneğin, [ a*e ] aşağıdakilerden herhangi birine eşdeğerdir: 99ae9, aaaaaae, a999e99. $ Dolar sembolü dizenin sonuyla eşleşir. (Yeni satır karakteriyle eşleştirmek için \n kullanın.) karakter+ Artı sembolü bir karakterin bir veya daha fazla tekrarını belirtir. Dolayısıyla smith+ern, örneğin smithhhern'e eşdeğerdir. [^ sicim] Düzeltme işareti simgesi, köşeli parantezlerin içindeyken, köşeli parantezler içindeki karakterleri geçersiz kılar. Böylece [^abc] diğer dizelerle karşılaştırıldığında, hata a, b veya c'den birini bile içeren herhangi biriyle eşleşmek için. ( ifade)$N Ekteki normal ifadeyle eşleşen değeri ( N+1). geri parametre. On adet kapalı normal ifadeye izin verilir. Görevlendirmeler koşulsuz olarak yapılır. ( ifade) *, + veya .] gibi bir operatörün parantez içindeki alt ifade üzerinde çalışmasına olanak tanıyan bir alt ifadeyi gruplandırır. Örneğin, (a*(cb+)*)$0 .

Not:

  1. Yapmak Olumsuzçok baytlı karakterler kullanın.
  2. ] (sağ köşeli parantez) öğesini bir çift köşeli parantez içinde tek başına kullanabilirsiniz, ancak bu yalnızca açılan sol köşeli parantezden hemen sonra geliyorsa veya hemen [^'den sonra geliyorsa. Örneğin: –], ] ve – karakterleriyle eşleşir.
  3. Önceki sembollerin tümü özel. Sembolün kendisini kullanmak için \ ile onlardan önce gelirsiniz. Örneğin, a\.e, a.e'ye eşdeğerdir.
  4. – (tire) işaretini tek başına kullanabilirsiniz, ancak yalnızca ifadedeki ilk veya son karakter olması durumunda. Örneğin --0] ifadesi ] ile veya - 0'a kadar olan karakterlerle eşleşir. Aksi halde \– kullanın.

Döndürülen değer

Başarılı olursa, regcomp() 0 değerini döndürür.

Başarısız olursa, regcomp() sıfırdan farklı bir değer döndürür ve içeriği hamile tanımsızdır.

Örnek

CELEBR07⁄* CELEBR07 Bu örnek genişletilmiş bir düzenli ifadeyi derler. *⁄ #dahil et #katmak #katmak #katmak main() ( regex_t preg; char *string = "basit bir dize"; char *pattern = ".*(simple).*"; int rc; if ((rc = regcomp(&preg, desen, REG_EXTENDED)) != 0) ( printf("regcomp() başarısız oldu, sıfırdan farklı bir değer döndürüyor (%d)", rc); çıkış(1); ))

> int regcomp(regex_t *hamile, sabit karakter *normal ifade, dahilibayraklar); int regexec(const regex_t *hamile, sabit karakter *sicim, size_teşleşme, regmatch_tpmatch, dahilibayraklar); size_t regerror(int)hata kodu, const regex_t *hamile, karakter *hata, size_terrbuf_size); geçersiz regfree(regex_t *hamile);

TANIM

POSIX düzenli ifadelerini derlemek

İşlev düzenli düzenleme() normal ifadeyi sonraki aramalara uygun bir formatta derlemek için kullanılır. normal ifade().

düzenli düzenleme() arabellek şablonu depolama alanına bir işaretçi iletilir hamile, boş karakterle sonlandırılmış bir dizenin işaretçisi normal ifade ve bayraklar bayraklar, derleme türünü belirlemek için kullanılır.

Tüm normal ifade aramalarının derlenmiş bir arabellek modeli kullanılarak yapılması gerekir; bu nedenle normal ifade() her zaman işlev tarafından başlatılan arabellek şablonunun adresiyle çağrılmalıdır düzenli düzenleme().

Anlam bayraklar bit düzeyinde oluşabilir veya aşağıdaki değerlerden sıfır veya daha fazlası: REG_EXTENDED Yorumlama sırasında POSIX genişletilmiş düzenli ifade sözdizimini kullanın normal ifade. Bu işaret etkinleştirilmezse POSIX basit düzenli ifade sözdizimi kullanılır. REG_ICASE Büyük/küçük harf durumunu dikkate almayın. Sonraki aramalar normal ifade() bu arabellek deseninin kullanılması büyük/küçük harfe duyarlı olmayacaktır. REG_NOSUB Maçların konumunu bildirmeyin. Seçenekler eşleşme Ve pmatchİçin normal ifade() verilen arabellek şablonu bu bayrak etkinken derlendiyse göz ardı edilir. REG_NEWLINE Operatörleri herhangi bir karakterle eşleştirin, yeni satır karakteriyle eşleşmez. Eşleşmeyen karakterlerin listesi ( [^...] ) yeni satır karakteri olmadan yeni satırla eşleşmez. Bir dizenin başlangıcına dayalı karşılaştırma operatörü ( ^ ) ne olursa olsun, yeni satırdan hemen sonraki boş dizeyle eşleşir bayraklar, yürütme bayrakları normal ifade(), içermek REG_NOTBOL. Satır sonu karşılaştırma operatörü ($), ne olursa olsun, boş dizeyi satırın başına kadar eşleştirir bayraklar içerir REG_NOTEOL.

POSIX normal ifadesiyle karşılaştırma

İşlev normal ifade() boş karakterle sonlandırılmış bir dizeyi önceden işlenmiş bir arabellek modeliyle karşılaştırmak için kullanılır hamile. Argümanlar eşleşme Ve pmatch Herhangi bir eşleşmenin konumu hakkında bilgi sağlamak için kullanılır. Anlam bayraklar bit düzeyinde olabilir VEYA değerlerden biri veya her ikisi REG_NOTBOL Ve REG_NOTEOL. Bu değerler aşağıda açıklandığı gibi karşılaştırma sürecinin davranışını belirler. REG_NOTBOL Dizenin başındaki karşılaştırma operatörü her zaman başarısız olur (yukarıda açıklanan derleme bayrağına bakın) REG_NEWLINE). Bu bayrak şu durumlarda kullanılabilir: normal ifade() bir dizenin ayrı bölümleri iletilir ve bu durumda böyle bir dizenin başlangıcı, yeni bir satırın başlangıcı olarak yorumlanmamalıdır. REG_NOTEOL Satır sonu karşılaştırma operatörü her zaman başarısız olur (ancak yukarıda açıklanan derleme bayrağına bakın) REG_NEWLINE).

Bayt ofsetleri

Eğer REG_NOSUB Tampon şablonu derlenirken ayarlanmadıysa eşleşmelerin konumu hakkında bilgi edinmek mümkündür. Anlam pmatch en azından sahip olacak şekilde tanımlanmalıdır eşleşme elementler. Dolduruyorlar normal ifade() satır içi eşleşmelerin adresleri. İle başlayan bir alt ifadenin uzaklıkları Ben açık braket, içinde saklanır pmatch[i]. Normal ifadenin tamamının eşleşme adresi, pmatch(eşleşme ofsetlerini döndürmek için şunu unutmayın N alt ifadeler, anlam eşleşme daha az olmamalı N+1). Kullanılmayan yapı elemanları -1 değerini içerecektir.

Yapı regmatch_t, bir tür olan pmatch, içinde tanımlanmış :

typedef yapısı (
regoff_t rm_so;
regoff_t rm_eo;) regmatch_t;

Her öğe rm_so-1'e eşit değil, verilen dize içindeki bir sonraki en büyük alt dize eşleşmesinin başlangıç ​​uzaklığını gösterir. Göreli öğe rm_eo eşleşen metinden sonraki ilk karakter olan eşleşmenin sonunun uzaklığını belirtir.

POSIX Hata Raporlaması

İşlev yeniden hata alınabilecek hata kodlarını dönüştürmek için kullanılır. düzenli düzenleme() Ve normal ifade(), hata mesajı satırlarında.

İÇİNDE yeniden hata iletilen: hata kodu hata kodu, arabellek deseni hamile,karakter dizesi arabelleğinin işaretçisi hata ve satır arabellek boyutu errbuf_size. İşlev boyutu döndürür hata Hata mesajını boş karakterle sonlandırılmış bir dize olarak depolamak için gereklidir. Eğer hata, Ve errbuf_size sıfıra eşit değildir, o zaman hata ilk önce dolduruldu errbuf_size - 1 hata mesajının sembolleridir ve boş bayt (aq\0aq) ile biter.

POSIX şablon arabelleğini boşaltma

İşlev kayıtsız() arabellek şablonuna ayrılan belleği serbest bırakır hamile kullanarak derleme işlemi sırasında düzenli düzenleme().

GERİ DÖNÜŞ DEĞERİ

İşlev düzenli düzenleme() başarılı derleme durumunda sıfırı veya aksi durumda bir hata kodunu döndürür.

İşlev normal ifade() eşleşmede sıfır döndürür veya REG_NOMATCH, eğer eşleşme olmasaydı.

HATALAR

İşlev düzenli düzenleme() aşağıdaki hataları döndürebilir: REG_BADBR Backlink operatörünün yanlış kullanımı. REG_BADPAT Grup veya liste operatörleri gibi şablon operatörlerinin yanlış kullanımı. REG_BADRPTİlk karakter olarak "*" kullanılması gibi tekrarlama operatörlerinin yanlış kullanımı. REG_EBRACE Aralık işleçlerinde eşleştirilmemiş parantezler. REG_EBRACK Liste ifadelerinde eşleştirilmemiş köşeli parantezler. REG_ECOLLATE Geçersiz sıralama öğesi. REG_ECTYPE Bilinmeyen karakter sınıfı adı. REG_EEND Potansiyel hata. POSIX.2'de tanımlanmamıştır. REG_EESCAPE Sondaki ters eğik çizgi. REG_EPAREN Gruplama işleçlerinde eşleştirilmemiş parantezler. REG_ERANGE Bölge operatörünün yanlış kullanımı: Örneğin, bölgenin sonu başından önce görünüyor. REG_ESIZE Derlenmiş normal ifade, 64 KB'tan büyük bir arabellek modeli gerektirir. Bu POSIX.2'de tanımlanmamıştır. REG_ESPACE Düzenli ifade rutinlerinin belleği tükendi. REG_ESUBREG Alt ifadeye geçersiz geri başvuru.

#katmak
#katmak
int regcomp(regex_t *hamile, sabit karakter *normal ifade, dahilibayraklar);
int regexec(const regex_t *hamile, sabit karakter *sicim, size_teşleşme,
regmatch_tpmatch, dahilibayraklar);
size_t regerror(int)hata kodu, const regex_t *hamile, karakter *hata,
size_terrbuf_size);
geçersiz regfree(regex_t *hamile);

TANIM

POSIX düzenli ifadelerini derlemek

İşlev düzenli düzenleme() normal ifadeyi sonraki aramalara uygun bir formatta derlemek için kullanılır. normal ifade().

düzenli düzenleme() arabellek şablonu depolama alanına bir işaretçi iletilir hamile, boş karakterle sonlandırılmış bir dizenin işaretçisi normal ifade ve bayraklar bayraklar, derleme türünü belirlemek için kullanılır.

Tüm normal ifade aramalarının derlenmiş bir arabellek modeli kullanılarak yapılması gerekir; bu nedenle normal ifade() her zaman işlev tarafından başlatılan arabellek şablonunun adresiyle çağrılmalıdır düzenli düzenleme().

Anlam bayraklar bit düzeyinde oluşabilir veya aşağıdaki değerlerden sıfır veya daha fazlası:

REG_EXTENDED Yorumlama sırasında POSIX genişletilmiş düzenli ifade sözdizimini kullanın normal ifade. Bu işaret etkinleştirilmezse POSIX basit düzenli ifade sözdizimi kullanılır. REG_ICASE Büyük/küçük harf durumunu dikkate almayın. Sonraki aramalar normal ifade() bu arabellek deseninin kullanılması büyük/küçük harfe duyarlı olmayacaktır. REG_NOSUB Maçların konumunu bildirmeyin. Seçenekler eşleşme Ve pmatchİçin normal ifade() verilen arabellek şablonu bu bayrak etkinken derlendiyse göz ardı edilir. REG_NEWLINE Operatörleri herhangi bir karakterle eşleştirin, yeni satır karakteriyle eşleşmez.

Eşleşmeyen karakterlerin listesi ( [^...] ) yeni satır karakteri olmadan yeni satırla aynı şey değildir.

Bir dizenin başlangıcına dayalı karşılaştırma operatörü ( ^ ) ne olursa olsun yeni satırdan hemen sonraki boş dizeyle eşleşir bayraklar, yürütme bayrakları normal ifade(), içermek REG_NOTBOL.

Satır sonu karşılaştırma operatörü ($), ne olursa olsun, boş dizeyi satır başı karakterine kadar eşleştirir bayraklar içerir REG_NOTEOL.

POSIX normal ifadesiyle karşılaştırma

İşlev normal ifade() boş karakterle sonlandırılmış bir dizeyi önceden işlenmiş bir arabellek modeliyle karşılaştırmak için kullanılır hamile. Argümanlar eşleşme Ve pmatch Herhangi bir eşleşmenin konumu hakkında bilgi sağlamak için kullanılır. Anlam bayraklar bit düzeyinde olabilir VEYA değerlerden biri veya her ikisi REG_NOTBOL Ve REG_NOTEOL. Bu değerler aşağıda açıklandığı gibi karşılaştırma sürecinin davranışını belirler. REG_NOTBOL Dizenin başlangıcındaki karşılaştırma operatörü her zaman başarısız olur (ancak yukarıda açıklanan derleme bayrağına bakın) REG_NEWLINE). Bu bayrak şu durumlarda kullanılabilir: normal ifade() bir dizenin ayrı bölümleri iletilir ve bu durumda böyle bir dizenin başlangıcı, yeni bir satırın başlangıcı olarak yorumlanmamalıdır. REG_NOTEOL Satır sonu karşılaştırma operatörü her zaman başarısız olur (ancak yukarıda açıklanan derleme bayrağına bakın) REG_NEWLINE).

Bayt ofsetleri

Eğer REG_NOSUB Tampon şablonu derlenirken ayarlanmadıysa eşleşmelerin konumu hakkında bilgi edinmek mümkündür. Anlam pmatch en azından sahip olacak şekilde tanımlanmalıdır eşleşme elementler. Dolduruyorlar normal ifade() satır içi eşleşmelerin adresleri. İle başlayan bir alt ifadenin uzaklıkları Ben- açık parantez, içinde saklanır pmatch[i]. Normal ifadenin tamamının eşleşme adresi, pmatch(eşleşme ofsetlerini döndürmek için şunu unutmayın N alt ifadeler, anlam eşleşme daha az olmamalı N+1). Kullanılmayan yapı elemanları -1 değerini içerecektir.

Yapı regmatch_t, bir tür olan pmatch, içinde tanımlanmış :

Typedef struct ( regoff_t rm_so; regoff_t rm_eo; ) regmatch_t;

Her öğe rm_so-1'e eşit değil, verilen dize içindeki en büyük alt dizenin bir sonraki eşleşmesinin başlangıç ​​uzaklığını gösterir. Göreli öğe rm_eo eşleşen metinden sonraki ilk karakter olan eşleşmenin sonunun uzaklığını belirtir.

POSIX Hata Raporlaması

İşlev yeniden hata alınabilecek hata kodlarını dönüştürmek için kullanılır. düzenli düzenleme() Ve normal ifade(), hata mesajı satırlarına.

İÇİNDE yeniden hata iletilen: hata kodu hata kodu, arabellek deseni hamile, karakter dizisi arabelleğine yönelik bir işaretçi hata ve satır arabellek boyutu errbuf_size. İşlev boyutu döndürür hata Hata mesajını boş karakterle sonlandırılmış bir dize olarak depolamak için gereklidir. Eğer hata, Ve errbuf_size sıfıra eşit değildir, o zaman hata ilk önce dolduruldu errbuf_size - 1 hata mesajı karakterlerini içerir ve boş bayt ("\0") ile biter.

POSIX şablon arabelleğini boşaltma

İşlev kayıtsız() arabellek şablonuna ayrılan belleği serbest bırakır hamile kullanarak derleme işlemi sırasında düzenli düzenleme().

GERİ DÖNÜŞ DEĞERİ

İşlev düzenli düzenleme() başarılı derleme durumunda sıfırı veya aksi durumda bir hata kodunu döndürür.

İşlev normal ifade() eşleşmede sıfır döndürür veya REG_NOMATCH, eğer eşleşme olmasaydı.

HATALAR

İşlev düzenli düzenleme() aşağıdaki hataları döndürebilir: REG_BADBR Backlink operatörünün yanlış kullanımı. REG_BADPAT Grup veya liste operatörleri gibi şablon operatörlerinin yanlış kullanımı. REG_BADRPTİlk karakter olarak "*" kullanılması gibi tekrarlama operatörlerinin yanlış kullanımı. REG_EBRACE Aralık işleçlerinde eşleştirilmemiş parantezler. REG_EBRACK Liste ifadelerinde eşleştirilmemiş köşeli parantezler. REG_ECOLLATE Geçersiz sıralama öğesi. REG_ECTYPE Bilinmeyen karakter sınıfı adı. REG_EEND Potansiyel hata. POSIX.2'de tanımlanmamıştır. REG_EESCAPE Sondaki ters eğik çizgi. REG_EPAREN Gruplama işleçlerinde eşleştirilmemiş parantezler. REG_ERANGE Alan operatörünün yanlış kullanımı: Örneğin, alanın sonu başından önce görünüyor. REG_ESIZE Derlenmiş normal ifade, 64 KB'tan büyük bir arabellek modeli gerektirir. Bu POSIX.2'de tanımlanmamıştır. REG_ESPACE Düzenli ifade rutinlerinin belleği tükendi. REG_ESUBREG Alt ifadeye geçersiz geri başvuru.

Görüntüleme