A kiválasztott változat és az aktuális verzió közötti különbségek a következők.
oktatas:programozas:c:regularis_kifejezesek [2017/10/02 20:29] |
oktatas:programozas:c:regularis_kifejezesek [2019/08/21 17:49] admin létrehozva |
||
---|---|---|---|
Sor 1: | Sor 1: | ||
+ | [[:oktatas:programozás:c|< C]] | ||
+ | |||
+ | |||
+ | |||
+ | ====== A regex.h használata ====== | ||
+ | |||
+ | * **Szerző:** Sallai András | ||
+ | * Copyright (c) Sallai András, 2011 | ||
+ | * Licenc: GNU Free Documentation License 1.3 | ||
+ | * Web: http://szit.hu | ||
+ | ===== Használt függvények ===== | ||
+ | |||
+ | Négy függvényt használhatunk: | ||
+ | <code c> | ||
+ | int regcomp(regex_t *, const char *, int); | ||
+ | int regexec(const regex_t *, const char *, size_t, regmatch_t[], int); | ||
+ | size_t regerror(int, const regex_t *, char *, size_t); | ||
+ | void regfree(regex_t *); | ||
+ | </code> | ||
+ | |||
+ | ==== Regcomp ==== | ||
+ | |||
+ | |||
+ | Ez a függvény előkészíti a regexec hívást. | ||
+ | Meg kell adjuk a paraméterként a mintát és egyéb kapcsolókat. | ||
+ | A kapcsolók a következők lehetnek: | ||
+ | REG_EXTENDED = Kiterjesztett szabályos kifejezések használata | ||
+ | REG_ICASE = Kis- és nagybetű nem különbözik | ||
+ | REG_NOSUB = Jelentés csak a sikerről/sikertelenségről a regexec() esetén | ||
+ | REG_NEWLINE = Az új sor után is olvas | ||
+ | |||
+ | |||
+ | ==== Regexec ==== | ||
+ | |||
+ | Összehasonlítja a megadott szöveget a megadott mintával. | ||
+ | Ha a minta egyezik 0 eredményt kapunk, ha nem akkor REG_NOMATCH állandóval tér vissza. | ||
+ | REG_ENOSYS értékkel tér vissza ha a függvény nem támogatott. A következő jelzők használhatók: | ||
+ | |||
+ | REG_NOTBOL = ^ nem szöveg vége speciális karaktere helyett | ||
+ | REG_NOTEOL = $ nem szöveg vége speciális karakter helyett | ||
+ | |||
+ | |||
+ | ==== Regerror ==== | ||
+ | |||
+ | Értelmezi a regexec és a regcomp visszatérő hibakódokat és egy szöveget add helyettük. | ||
+ | Sikeres végrehajtás esetén megadja a visszaadott szöveg hosszát, ellenkező esetben 0-val. | ||
+ | |||
+ | |||
+ | |||
+ | ==== Regfree ==== | ||
+ | A regex számára lefoglalt memóriát felszabadítja. | ||
+ | |||
+ | |||
+ | |||
+ | ===== Példa ===== | ||
+ | |||
+ | <code c main.c> | ||
+ | #include <sys/types.h> | ||
+ | #include <regex.h> | ||
+ | | ||
+ | int match(const char *szoveg, char *minta) | ||
+ | { | ||
+ | int status; | ||
+ | regex_t re; | ||
+ | | ||
+ | if(regcomp(&re, minta, REG_EXTENDED|REG_NOSUB) != 0) | ||
+ | return 0; | ||
+ | status = regexec(&re, szoveg, (size_t)0, NULL, 0); | ||
+ | regfree(&re); | ||
+ | if(status != 0) | ||
+ | return 0; | ||
+ | | ||
+ | return 1; | ||
+ | } | ||
+ | </code> | ||
+ | | ||
+ | ===== Minta megadása ===== | ||
+ | |||
+ | char *minta = "([0-9]{1,3}\\.){3}[0-9]{1,3}"; | ||
+ | |||
+ | |||
+ | Számok megadása szögletes zárójellel. Egy tartományt határozunk meg: | ||
+ | [0-9] | ||
+ | 0 és 9 között bármely számjegy lehet. Ha csak ennyit adunk meg, az illeszkedéshez elég a karaktersorozatban egyetlen számjegy | ||
+ | ami bárhol lehet. | ||
+ | |||
+ | Ha a számnak a sor elején kell lennie: | ||
+ | ^[0-9] | ||
+ | Ha a számnak a sor végén kell lennie: | ||
+ | [0-9]$ | ||
+ | Ha a sor eleji és a sor végi illeszkedést is jelzem: | ||
+ | ^[0-9]$ | ||
+ | Akkor csak egyetlen egy számjegyű számra fog illeszkedni. | ||
+ | |||
+ | Kapcsos zárójellel megadhatjuk hány darabot várunk az előtte megadott mintából. | ||
+ | ^[0-9]{3}$ | ||
+ | A példában három számjegyet várunk. | ||
+ | |||
+ | Három "a" betűre illeszkedés például: | ||
+ | a{3} | ||
+ | |||
+ | Escape szekvenciák megadása a kettő darab visszaperjellel történik. | ||
+ | \\. | ||
+ | Például a pont megadása. | ||
+ | Pont működik Escape szekvencia nélkül is. | ||