正則匹配函數

轉載:http://blog.csdn.net/ithomer/article/details/6130806

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 是一個結構體數據類型,成員rm_so 存放匹配文本串在目標串中的開始位置,rm_eo 存放結束位置。通常我們以數組的形式定義一組這樣的結構。因為往往我們的規則表達式中還包含子規則表達式。數組0單元存放主規則表達式位置,后邊的單元依次存放子規則表達式位置。 compiled 是已經用regcomp函數編譯好的規則表達式。 string 是目標文本串。 nmatch 是regmatch_t結構體數組的長度。 matchptr regmatch_t類型的結構體數組,存放匹配文本串的位置信息。 eflags 有兩個值 REG_NOTBOL 按我的理解是如果指定了這個值,那么'^'就不會從我們的目標串開始匹配。總之我到現在還不是很明白這個參數的意義, 原文如下: If this bit is set, then the beginning-of-line operator doesn't match the beginning of the string (presumably because it's not the beginning of a line).If not set, then the beginning-of-line operator does match the beginning of the string. 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);

EXAMPLES

#include <regex.h>/** Match string against the extended regular expression in* pattern, treating errors as no match.** Return 1 for match, 0 for no match.*/int
match(const char *string, char *pattern)
{int    status;regex_t    re;if (regcomp(&re, pattern, REG_EXTENDED|REG_NOSUB) != 0) {return(0);      /* Report error. */}status = regexec(&re, string, (size_t) 0, NULL, 0);regfree(&re);if (status != 0) {return(0);      /* Report error. */}return(1);
}

The following demonstrates how the REG_NOTBOL flag could be used with?regexec() to find all substrings in a line that match a pattern supplied by a user. (For simplicity of the example, very little error checking is done.)

(void) regcomp (&re, pattern, 0);
/* This call to regexec() finds the first match on the line. */
error = regexec (&re, &buffer[0], 1, &pm, 0);
while (error == 0) {  /* While matches found. *//* Substring found between pm.rm_so and pm.rm_eo. *//* This call to regexec() finds the next match. */error = regexec (&re, buffer + pm.rm_eo, 1, &pm, REG_NOTBOL);
}

===========================================================

參考拓展:

regcomp和regexec函數

The Open Group

?


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/384417.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/384417.shtml
英文地址,請注明出處:http://en.pswp.cn/news/384417.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux系統編程(二)孤兒進程和僵尸進程

Linux系統編程&#xff08;二&#xff09;一、exec函數族1.exec函數二、孤兒進程和僵尸進程三、wait和waitpid1.wait函數2.waitpid函數一、exec函數族 exec函數使用時&#xff0c;改程序的用戶空間的代碼和數據會被新程序給替代&#xff0c;會從新程序的啟動例程開始。調用exe…

linux下c/c++實例之十socket簡單應用

轉自&#xff1a;http://blog.csdn.net/taiyang1987912/article/details/49738351 一、簡介 通過socket掃描本機打開的tcp端口號&#xff0c;模擬用戶名、密碼登錄服務器的過程、socket文件傳輸及模仿http服務器。 二、詳解 1、Linux下tcp端口掃描 &#xff08;1&#xff09;…

Linux系統編程(三)進程間的通信

Linux系統編程&#xff08;三&#xff09;進程間的通信一、為什么需要進程之間的通信&#xff08;IPC&#xff09;&#xff1f;二、管道1.概念2.特質3.原理4.局限性5.代碼2.讀入數據三、共享存儲映射注意事項父子進程通信一、為什么需要進程之間的通信&#xff08;IPC&#xff…

使用mmap實現大文件的復制:單進程與多進程情況

單線程和多進程實現文件的復制&#xff08;mmap方法&#xff09; mmap實現大文件的復制單線程和多進程實現文件的復制&#xff08;mmap方法&#xff09;一、單線程實現二、多進程實現一般文件實現方法&#xff1a;1.讀取&#xff08;fread&#xff09;要復制的文件2.寫入&#…

exec 函數族

轉自&#xff1a;http://www.cnblogs.com/mickole/p/3187409.html linux系統編程之進程&#xff08;五&#xff09;&#xff1a;exec系列函數&#xff08;execl,execlp,execle,execv,execvp)使用 本節目標&#xff1a; exec替換進程映像exec關聯函數組&#xff08;execl、execl…

Linux系統編程(四)信號

Linux系統編程&#xff08;四&#xff09;信號一、什么是信號&#xff1f;1、信號的本質2、信號來源硬件來源軟件來源二、常見信號1.可靠信號和不可靠信號2、不可靠信號主要有以下問題:3、可靠信號與不可靠信號注冊機制三、信號處理方式四、信號處理過程五、未決信號和阻塞信號…

SIGCHLD信號回收子進程

SIGCHLD信號回收子進程代碼問題注意點代碼 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/wait.h> #include <signal.h>void handler(int signo) {int status; pid_t pid;while ((pid waitpid(0, &status…

Wait waitpid

轉自&#xff1a;http://www.cnblogs.com/mickole/p/3187770.html linux系統編程之進程&#xff08;六&#xff09;&#xff1a;父進程查詢子進程的退出,wait,waitpid 本節目標&#xff1a; 僵進程SIGCHLDwaitwaitpid 一&#xff0c;僵尸進程 當一個子進程先于父進程結束運行時…

Linux系統編程(五)時序競態

時序競態產生原因改進總結產生原因 #include <cstdio> #include <stdio.h> #include <sys/time.h> #include <unistd.h> #include <signal.h> #include <stdlib.h> #include <errno.h>void catch_sigalrm(int signo) {printf("…

Linux C++ 簡單爬蟲

轉載&#xff1a;http://blog.csdn.net/orthocenterchocolate/article/details/38665937 方便易用&#xff0c;傳入URL&#xff0c;返回對應頁面的內容 [cpp] view plaincopy #include <iostream> #include <string> #include <netdb.h> #include <…

Linux系統編程(六)守護進程

Linux系統編程&#xff08;六&#xff09;守護進程一、進程組概念二、會話創建會話的條件守護進程概念守護進程模型創建守護進程一、進程組 概念 進程組&#xff0c;也稱之為作業。代表一個或多個進程的集合。每個進程都屬于一個進程組。 當父進程&#xff0c;創建子進程的時…

TCP 客戶端和服務器端

轉自&#xff1a;http://blog.csdn.net/itcastcpp/article/details/39047265 前面幾篇中實現的client每次運行只能從命令行讀取一個字符串發給服務器&#xff0c;再從服務器收回來&#xff0c;現在我們把它改成交互式的&#xff0c;不斷從終端接受用戶輸入并和server交互。 [cp…

利用多線程實現linux下C語言的聊天室程序:

轉載&#xff1a;http://www.360doc.com/content/16/0421/11/478627_552531090.shtml 利用多線程實現linux下C語言的聊天室程序&#xff1a; 客戶端代碼&#xff1a; threadsend線程負責客戶端消息的發送&#xff1b; threadrecv線程負責客戶端接受服務器端的消息。 [html] v…

Linux系統編程(七)消息隊列

Linux系統編程&#xff08;七&#xff09;消息隊列一、什么是消息隊列二、消息隊列內部原理三、實現消息隊列的收發1.發送消息隊列2.接收消息隊列四、消息隊列與命名管道的比較一、什么是消息隊列 消息隊列提供了一種從一個進程向另一個進程發送一個數據塊的方法。每個數據塊都…

基于Linux的SOCKET編程之TCP半雙工Client-Server聊天程序

轉自&#xff1a;http://blog.csdn.net/apollon_krj/article/details/53398448#0-tsina-1-64987-397232819ff9a47a7b7e80a40613cfe1 所謂半雙工通信&#xff0c;即通信雙方都可以實現接發數據&#xff0c;但是有一個限制&#xff1a;只能一方發一方收&#xff0c;之后交換收發對…

Linux系統編程(八)線程

Linux系統編程&#xff08;八&#xff09;線程一、什么是線程&#xff1f;二、Linux內核線程實現原理線程共享資源線程非共享資源線程優缺點線程控制原語一、什么是線程&#xff1f; LWP&#xff1a;light weight process 輕量級的進程&#xff0c;本質仍是進程(在Linux環境下…

智能算法(GA、DBO等)求解阻塞流水車間調度問題(BFSP)

先做一個聲明&#xff1a;文章是由我的個人公眾號中的推送直接復制粘貼而來&#xff0c;因此對智能優化算法感興趣的朋友&#xff0c;可關注我的個人公眾號&#xff1a;啟發式算法討論。我會不定期在公眾號里分享不同的智能優化算法&#xff0c;經典的&#xff0c;或者是近幾年…

Linux socket編程,對套接字進行封裝

轉自&#xff1a;http://www.cnblogs.com/-Lei/archive/2012/09/04/2670942.html 下面是對socket操作的封裝&#xff0c;因為在Linux下寫中文到了windows里面會亂碼&#xff0c;所以注釋用英文來寫&#xff0c;有空再查下解決方法吧 socket.h #ifndef SOCKET_H #define SOCKET_…

Linux系統編程(九)線程同步

Linux系統編程&#xff08;九&#xff09;線程同步一、什么是線程同步&#xff1f;二、互斥量三、條件變量pthread_cond_wait函數pthread_cond_signal函數生產者和消費者模型一、什么是線程同步&#xff1f; 線程同步&#xff0c;指一個線程發出某一功能調用時&#xff0c;在沒…

linux網絡編程(一)網絡基礎傳輸知識

linux網絡編程&#xff08;一&#xff09;網絡傳輸基礎知識一、什么是協議&#xff1f;二、使用步驟典型協議2.網絡應用程序設計模式C/S模式B/S模式優缺點3.分層模型4.TCP/IP四層模型通信過程5.協議格式數據包封裝以太網幀格式ARP數據報格式IP段格式UDP數據報格式TCP數據報格式…