遍匈 / 屎夸燕器塀 /

C囂冱屎夸燕器塀峋盾 regcomp() regexec() regfree()峋盾

<貧匯准 和匯准>
炎彈議C才C++脅音屶隔屎夸燕器塀?徽嗤匯乂痕方垂辛參絹廁C/C++殻會埀頼撹宸匯孔嬬?凪嶄恷广兆議輝方Philip Hazel議Perl-Compatible Regular Expression垂?俯謹Linux窟佩井云脅揮嗤宸倖痕方垂。

C囂冱侃尖屎夸燕器塀械喘議痕方嗤regcomp()、regexec()、regfree()才regerror()?匯違蛍葎眉倖化帶?泌和侭幣?

C囂冱嶄聞喘屎夸燕器塀匯違蛍葎眉化?
  1. 園咎屎夸燕器塀 regcomp()
  2. 謄塘屎夸燕器塀 regexec()
  3. 瞥慧屎夸燕器塀 regfree()


和円頁斤眉倖痕方議峋聾盾瞥

1、int regcomp (regex_t *compiled, const char *pattern, int cflags)
宸倖痕方委峺協議屎夸燕器塀pattern園咎撹匯嶽蒙協議方象鯉塀compiled?宸劔辛參聞謄塘厚嗤丼。痕方regexec 氏聞喘宸倖方象壓朕炎猟云堪嶄序佩庁塀謄塘。峇佩撹孔卦指0。

歌方傍苧?
?regex_t 頁匯倖潤更悶方象窃侏?喘栖贋慧園咎朔議屎夸燕器塀?万議撹埀re_nsub 喘栖贋刈屎夸燕器塀嶄議徨屎夸燕器塀議倖方?徨屎夸燕器塀祥頁喘垈凄催淫軟栖議何蛍燕器塀。
?pattern 頁峺?厘断亟挫議屎夸燕器塀議峺寞。
?cflags 嗤泌和4倖峙賜宀頁万断賜塰麻(|)朔議峙?
REG_EXTENDED 參孔嬬厚紗膿寄議制婢屎夸燕器塀議圭塀序佩謄塘。
REG_ICASE 謄塘忖銚扮策待寄弌亟。
REG_NOSUB 音喘贋刈謄塘朔議潤惚。
REG_NEWLINE 紛艶算佩憲?宸劔'$'祥辛參貫佩硫蝕兵謄塘?'^'祥辛參貫佩議蝕遊蝕兵謄塘。

2. int regexec (regex_t *compiled, char *string, size_t nmatch, regmatch_t matchptr [], int eflags)
輝厘断園咎挫屎夸燕器塀朔?祥辛參喘regexec 謄塘厘断議朕炎猟云堪阻?泌惚壓園咎屎夸燕器塀議扮昨短嗤峺協cflags議歌方葎REG_NEWLINE?夸潮範秤趨和頁策待算佩憲議?匆祥頁委屁倖猟云堪輝恬匯倖忖憲堪侃尖。峇佩撹孔卦指0。
regmatch_t 頁匯倖潤更悶方象窃侏?壓regex.h嶄協吶?
typedef struct
{
regoff_t rm_so;
regoff_t rm_eo;
} regmatch_t;
撹埀rm_so 贋慧謄塘猟云堪壓朕炎堪嶄議蝕兵了崔?rm_eo 贋慧潤崩了崔。宥械厘断參方怏議侘塀協吶匯怏宸劔議潤更。咀葎吏吏厘断議屎夸燕器塀嶄珊淫根徨屎夸燕器塀。方怏0汽圷贋慧麼屎夸燕器塀了崔?朔円議汽圷卆肝贋慧徨屎夸燕器塀了崔。

歌方傍苧?
?compiled 頁厮将喘regcomp痕方園咎挫議屎夸燕器塀。
?string 頁朕炎猟云堪。
?nmatch 頁regmatch_t潤更悶方怏議海業。
∠matchptr regmatch_t窃侏議潤更悶方怏?贋慧謄塘猟云堪議了崔佚連。
⊥eflags 嗤曾倖峙
REG_NOTBOL 梓厘議尖盾頁泌惚峺協阻宸倖峙?椎担'^'祥音氏貫厘断議朕炎堪蝕兵謄塘。悳岻厘欺孖壓珊音頁載苧易宸倖歌方議吭吶?
REG_NOTEOL 才貧円椎倖恬喘餓音謹?音狛宸倖峺協潤崩end of line。

3. void regfree (regex_t *compiled)
輝厘断聞喘頼園咎挫議屎夸燕器塀朔?賜宀勣嶷仟園咎凪麿屎夸燕器塀議扮昨?厘断辛參喘宸倖痕方賠腎compiled峺?議regex_t潤更悶議坪否?萩芝廖?泌惚頁嶷仟園咎議三?匯協勣枠賠腎regex_t潤更悶

4. size_t regerror (int errcode, regex_t *compiled, char *buffer, size_t length)
輝峇佩regcomp 賜宀regexec 恢伏危列議扮昨?祥辛參距喘宸倖痕方遇卦指匯倖淫根危列佚連議忖憲堪。

歌方傍苧?
?errcode 頁喇regcomp 才 regexec 痕方卦指議危列旗催。
?compiled 頁厮将喘regcomp痕方園咎挫議屎夸燕器塀?宸倖峙辛參葎NULL。
?buffer 峺?喘栖贋慧危列佚連議忖憲堪議坪贋腎寂。
∠length 峺苧buffer議海業?泌惚宸倖危列佚連議海業寄噐宸倖峙?夸regerror 痕方氏徭強舜僅階竃議忖憲堪?徽麿挽隼氏卦指頼屁議忖憲堪議海業。侭參厘断辛參喘泌和議圭隈枠誼欺危列忖憲堪議海業。

size_t length = regerror (errcode, compiled, NULL, 0);

和円頁匯倖謄塘Email箭徨?梓孚貧中議眉化祥辛參。

和中議殻會減夭貫凋綜佩資函屎夸燕器塀?隼朔繍凪塰喘噐貫炎彈補秘誼欺議耽佩方象?旺嬉咫竃謄塘潤惚。
#include <stdio.h>
#include <sys/types.h>
#include <regex.h>

/* 函徨堪議痕方 */
static char* substr(const char*str,
unsigned start, unsigned end)
{
unsigned n = end - start;
static char stbuf[256];
strncpy(stbuf, str + start, n);
stbuf[n] = 0;
return stbuf;
}

/* 麼殻會 */
int main(int argc, char** argv)
{
char * pattern;
int x, z, lno = 0, cflags = 0;
char ebuf[128], lbuf[256];
regex_t reg;
regmatch_t pm[10];
const size_t nmatch = 10;
/* 園咎屎夸燕器塀*/
pattern = argv[1];
z = regcomp(?, pattern, cflags);
if (z != 0){
regerror(z, ?, ebuf, sizeof(ebuf));
fprintf(stderr, "%s: pattern '%s' \n",ebuf, pattern);
return 1;
}
/* 幟佩侃尖補秘議方象 */
while(fgets(lbuf, sizeof(lbuf), stdin))
{
++lno;
if ((z = strlen(lbuf)) > 0 && lbuf[z-1] == '\n')
lbuf[z - 1] = 0;
/* 斤耽匯佩哘喘屎夸燕器塀序佩謄塘 */
z = regexec(?, lbuf, nmatch, pm, 0);
if (z == REG_NOMATCH) continue;
else if (z != 0) {
regerror(z, ?, ebuf, sizeof(ebuf));
fprintf(stderr, "%s: regcom('%s')\n", ebuf, lbuf);
return 2;
}
/* 補竃侃尖潤惚 */
for (x = 0; x < nmatch && pm[x].rm_so != -1; ++ x)
{
if (!x) printf("%04d: %s\n", lno, lbuf);
printf(" $%d='%s'\n", x, substr(lbuf, pm[x].rm_so, pm[x].rm_eo));
}
}
/* 瞥慧屎夸燕器塀 */
regfree(?);
return 0;
}

峇佩和中議凋綜辛參園咎旺峇佩乎殻會?
# gcc regexp.c -o regexp
# ./regexp 'regex[a-z]*' < regexp.c
0003: #include <regex.h>
0ドル='regex'
0027: regex_t reg;
0ドル='regex'
0054: z = regexec(?, lbuf, nmatch, pm, 0);
0ドル='regexec'



弌潤?斤椎乂俶勣序佩鹸墫方象侃尖議殻會栖傍?屎夸燕器塀涙夘頁匯倖掲械嗤喘議垢醤。云猟嶷泣壓噐懐峰泌採壓C囂冱嶄旋喘屎夸燕器塀栖酒晒忖憲堪侃尖?參宴壓方象侃尖圭中嬬校資誼嚥Perl囂冱窃貌議痩試來。
<貧匯准 和匯准>

AltStyle によって変換されたページ (->オリジナル) /