字元
含義舉例
.匹配任意乙個字元
如「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正規表示式 編寫正規表示式
為了所有實用化的用途,你可以通過使用程式產生正確的結果。然而,並不意味著程式總是如你所願的那樣正確地工作。多數情況下,如果程式不能產生想要的輸出,可以斷定真正的問題 排除輸入或語法錯誤 在於如何描述想要的東西。換句話說,應該考慮糾正問題的地方是描述想要的結果的表示式。表示式不完整或者公式表示得不正確...