程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> [C/C++]正則表達式

[C/C++]正則表達式

編輯:C++入門知識

首先說明,標准C/C++都不支持正則表達式,但有些函數庫提供了這個功能,Philip Hazel的Perl-Compatible Regular Expression庫,並且大多數Linux發行版本都帶有這個函數庫。

使用正則表達式可簡單的分成幾步:

1.編譯正則表達式

2.執行匹配

3.釋放內存

首先,編譯正則表達式

int regcomp(regex_t *preg, const char *regex, int cflags);

reqcomp()函數用於把正則表達式編譯成某種格式,可以使後面的匹配更有效。

preg: regex_t結構體用於存放編譯後的正則表達式;

regex: 指向正則表達式指針;

cflags:編譯模式

共有如下四種編譯模式:

REG_EXTENDED:使用功能更強大的擴展正則表達式

REG_ICASE:忽略大小寫

REG_NOSUB:不用存儲匹配後的結果

REG_NEWLINE:識別換行符,這樣‘$’就可以從行尾開始匹配,‘^’就可以從行的開頭開始匹配。否則忽略換行符,把整個文本串當做一個字符串處理。

其次,執行匹配

int regexec(const regex_t *preg, const char *string, size_t nmatch, regmatch_t pmatch[], int eflags);

preg: 已編譯的正則表達式指針;

string:目標字符串;

nmatch:pmatch數組的長度;

pmatch:結構體數組,存放匹配文本串的位置信息;

eflags:匹配模式

共兩種匹配模式:

REG_NOTBOL:The match-beginning-of-line operator always fails to match  (but see  the  compilation  flag  REG_NEWLINE above). This flag may be used when different portions of a string are passed  to  regexec and the beginning of the string should not be interpreted as the beginning of the line.

REG_NOTEOL:The match-end-of-line operator always fails to  match  (but  see the compilation flag REG_NEWLINE above)

最後,釋放內存
void regfree(regex_t *preg);
當使用完編譯好的正則表達式後,或者需要重新編譯其他正則表達式時,一定要使用這個函數清空該變量。


其他,處理錯誤
size_t regerror(int errcode, const regex_t *preg, char *errbuf, size_t errbuf_size);
當執行regcomp 或者regexec 產生錯誤的時候,就可以調用這個函數而返回一個包含錯誤信息的字符串。
errcode: 由regcomp 和 regexec 函數返回的錯誤代號。
preg: 已經用regcomp函數編譯好的正則表達式,這個值可以為NULL。
errbuf: 指向用來存放錯誤信息的字符串的內存空間。
errbuf_size: 指明buffer的長度,如果這個錯誤信息的長度大於這個值,則regerror 函數會自動截斷超出的字符串,但他仍然會返回完整的字符串的長度。所以我們可以用如下的方法先得到錯誤字符串的長度。

示例

01
#include <stdio.h>
02
#include <stdlib.h>
03
#include <sys/types.h>
04
#include <regex.h>
05
 
06
int validate_pattern__r(const char *pattern, const char *in_str);
07
 
08
int main(int argc, char **argv)
09
{
10
   int  result = -1;
11
   char patt[] = "^([2-9][0-9]{3}|[1-9][0-9]{4,6}|10000000)$";
12
   char str[] = "10000000";
13
 
14
   result = validate_pattern__r(patt, str);
15
   if(0 == result)
16
   {
17
      printf("OK, match!\n");
18
   }
19
   else
20
   {
21
      printf("NOK, not match!\n");
22
   }
23
   
24
   return 0;
25
}
26
 
27
int validate_pattern__r(const char *pattern, const char *in_str)
28
{
29
   int     l_status = 0;
30
   regex_t l_re;
31
 
32
   printf("pattern: %s\n", pattern);
33
   printf("in_str: %s\n", in_str);
34
 
35
   regcomp(&l_re, pattern, REG_EXTENDED);
36
   l_status = regexec(&l_re, in_str, (size_t)0, NULL, 0);
37
   regfree(&l_re);
38
   if(0 != l_status)
39
   {
40
      return -1;
41
   }
42
 
43
   return 0;
44
}

作者:戀戀美食

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved