正規表示式

2021-10-01 18:00:25 字數 4653 閱讀 1800

字元

含義舉例

.匹配任意乙個字元

如「abc.」,可以匹配abc2、abcd、abc%等

匹配括號中的任意乙個字元

如「[abc]d」,可以匹配ad、bd、cd

-在括號範圍內表示範圍

如「[0-9]」,表示匹配0至9中任意乙個數字

^位於內開頭,匹配除括號內字元以外的任意字元

如「[^ab]」,表示匹配除了a、b之外的其他字元

?緊跟其前面的單元匹配零次或者一次

+緊跟其前面的單元匹配一次或者多次

*緊跟其前面的單元匹配零次或者多次

緊跟其前面的單元匹配精確的n次

如「k」,表示精確匹配kkk。

緊跟其前面的單元匹配至少n次

緊跟其前面的單元匹配最多m次

緊跟其前面的單元匹配至少n次,最多m次

^匹配行首的位置

$匹配行尾的位置

\<

匹配單詞開頭的位置

\>

匹配單詞結尾的位置

\b匹配單詞的邊界

如「\ba.t\b」,表示匹配類似a123t、axyzt等單詞

\b匹配非單詞邊界

如「\bh\b」,表示匹配的h不在單詞邊界,如host則不符合,因為h在單詞的邊界,而she則符合匹配。

|連線兩個子表示式,表示或的關係

如「n(ei|mn)」,匹配nei或者nmn

()將正規表示式部分組成分組,可引用分組

\轉義字元

\d匹配數字字元,效果同[0-9]

\d匹配非數字字元,效果同[0-9],或者同[\d]

\w匹配單詞字元,效果同[_a-za-z0-9]

\w匹配非單詞字元

\s匹配空白字元,效果同[ \t\n\r],注意括號中包括空格

\s匹配非空白字元

()分組、子模式(subpattern)

\1、\2…

通過後向引用重用捕獲內容

如「(the)(china people) \2 \1」,這裡的第乙個分組是the、第二個分組是china people,則\1表示第乙個分組,\2表示第二個分組。

(?:name)

非捕獲分組

如「(?:the|the)」,非捕獲分組不會將其儲存在記憶體,無法後向引用

標準的c與c++都不支援正規表示式,但是在某些場景下,正規表示式存在可以為程式帶來便利。

在c語言中,一些庫函式可以幫助我們實現在c中使用正規表示式的訴求。

以下介紹在linux環境下c語言中處理正規表示式的常用函式。

函式原型為:

#include

intregcomp

(regex_t *compiled,

const

char

*pattern,

int cflags)

;

函式作用:將指定的正規表示式格式pattern編譯成一種特定的資料格式compiled,這樣可以使得正規表示式的匹配更加有效。函式執行成功返回0。

引數說明:

regex_t是乙個結構體資料型別,用來存放編譯後的正規表示式,其成員re_nsub用來儲存正規表示式組合的子正規表示式的個數。

pattern指向要編譯的正規表示式字串。

cflags是標誌位。可以取值為:

a、reg_extended:以功能更加強大的擴充套件正規表示式的方式進行匹配

b、reg_icase:匹配字母時,忽略大小寫;

c、reg_nosub:不用儲存匹配後的結果;

d、reg_newline:識別換行符,則符號^與$可以分別從行首與行尾開始匹配。

###regexec函式

函式原型為:

#include

intregexec

(regex_t *compiled,

char

*string, size_t nmatch, regmatch_t matchptr,

int eflags)

;

函式作用:使用正規表示式執行匹配目標文字。如果在呼叫函式regcomp編譯正規表示式時,沒有指定cflags標誌位為reg_newline,則預設情況下忽略換行符,即將整個文字內的字串當作乙個整體來處理。函式執行成功返回0。

引數說明:

compiled是使用函式regcomp編譯好的正規表示式;

string是需要匹配的目標字串;

nmatch是regmatch_t結構體陣列的長度;

matchptr是regmatch_t型別的結構體陣列,存放匹配字串的位置資訊;

eflags取值為reg_notbol,即讓特殊字元^無作用,eflags取值為reg_noteol,即讓特殊字元$無作用。

regmatch_t是乙個結構體資料型別:

typedef

struct

regmatch_t;

/* 通常以陣列的形式定義一組regmatch_t結構,因為往往正規表示式中還包含子正規表示式,即存在分組

陣列0單元存放主正規表示式的位置

陣列1、2、3...依次存放子正規表示式的位置 */

函式原型為:

#include

void

regfree

(regex_t *compiled)

;

函式作用:使用完編譯好的正規表示式後,或者需要重新編譯其他的正規表示式時,需要使用函式regfree清空compiled指向的結構體內容。

函式原型為:

#include

size_t regerror

(int errcode, regex_t *compiled,

char

*buffer, size_t length)

;

函式作用:當執行regexec或者regcomp產生錯誤的時候,可以呼叫函式regerror以返回乙個包含錯誤資訊的字串。

引數說明:

errcode是由函式regexec或者regcomp返回的錯誤代號;

compiled是已經編譯好的正規表示式,其值可以為null;

buffer指向用來存放錯誤資訊的字串記憶體空間;

length指明buffer的長度,如果錯誤資訊的長度大於該值,則函式自動截斷超出的字串。

#include

#include

#include

intmy_match

(char

* pattern,

char

* buf)

printf

("\n");

regfree

(®);return status;

}int

main()

$";char buf[

1024]=

"41509030127"

;int status=

my_match

(pattern,buf);if

(status==reg_nomatch)

printf

("no match!\n");

elseif(

0== status)

return0;

}

在c語言中,可以對正規表示式相關的庫函式進行封裝,以實現方便的個人自定義介面。

typedef

struct

t_rereg;

#define fill_reg(buf, size, string, reg) do \

else \

} while(0)

#define len_reg(reg) (reg.end - reg.start)

#define valid_reg(reg) (reg.start >= 0 && reg.end >= reg.start)

#define re_free(p) free(p)

封裝的函式定義如下:

static

void

re_free_registers

(struct re_pattern_buffer *buffer,

struct re_registers *regs)if(

null

!= regs->end)

} buffer->regs_allocated = regs_unallocated;}}

/* 通常以陣列的形式定義一組t_rereg結構,因為往往正規表示式中還包含子正規表示式,即存在分組

陣列0單元存放主正規表示式的位置

陣列1、2、3...依次存放子正規表示式的位置 */

intcp_rematch

(const

char

*pattern,

const

char

*string, t_rereg *reregs,

unsigned

int*regnum)

*regnum = i;

}re_free_registers

(®ex,

®s);regfree

(®ex);}

return num;

}

正規表示式 正規表示式 總結

非負整數 d 正整數 0 9 1 9 0 9 非正整數 d 0 負整數 0 9 1 9 0 9 整數 d 非負浮點數 d d 正浮點數 0 9 0 9 1 9 0 9 0 9 1 9 0 9 0 9 0 9 1 9 0 9 非正浮點數 d d 0 0 負浮點數 正浮點數正則式 英文本串 a za z...

正規表示式 表示式

網域名稱 a za z0 9 a za z0 9 a za z0 9 a za z0 9 interneturl a za z s 或 http w w w 手機號碼 13 0 9 14 5 7 15 0 1 2 3 5 6 7 8 9 18 0 1 2 3 5 6 7 8 9 d 號碼 x x x...

Linux正規表示式 編寫正規表示式

為了所有實用化的用途,你可以通過使用程式產生正確的結果。然而,並不意味著程式總是如你所願的那樣正確地工作。多數情況下,如果程式不能產生想要的輸出,可以斷定真正的問題 排除輸入或語法錯誤 在於如何描述想要的東西。換句話說,應該考慮糾正問題的地方是描述想要的結果的表示式。表示式不完整或者公式表示得不正確...