正規表示式用法

2021-08-10 00:08:45 字數 2999 閱讀 7515

今天遇到乙個格式化字串輸入函式如下:

char *pcuserhdr = 「abc[username][inte***ce]」;

sscanf(pcuserhdr, "%*[^[%[^]]][%[^]]",acusername,acinte***ce);

對此學習了下,輸出乙個總結:

1. sscanf函式原型不多做解釋,直接以乙個例子開始;

sscanf(buf, "get /%[^ ]", buf_rev);

基本格式為 %[set],表示將接收乙個由set指定格式的字串,其中set表示可接受的字元集合。

set一般有兩種情況:

一種是"^set"表示非, 即在輸入的字串中將匹配所有不在set中出現的字元,遇到set中的字元時停止匹配。

另一種是"set"表示在輸入的字串中將匹配所有在set中出現的字元,遇到非set中的字元時停止匹配。 如:

scanf("%[^&]",buf); //當輸入的字元中出現"&"時停止匹配,如果輸入hello&world,則buf=hello;

scanf("%[^290#*]",buf); //當輸入aidc#ad時,則buf=aidc,

特殊情況:

(1)如果要匹配"^"時,當然不能直接放在中,所以可以用%[ab^cd]這種方式,

(2)當要匹配右方括號"]"時,應把其放在set中第乙個位置,如"%abc]"表示匹配的字符集為,又如"%[^]abc]"表示匹配所有非"], a, b, c"中的字元,另外,還可以使用"-" 如%[a-z]表示只匹配abcd....yz等小寫的字母; %[0-9]表示只匹配0,1,2...9等數字;

(3) * 表示跳過。

2. 舉例:

例1:#gcc test2.c -o test

#./test 

name = aaaa,number = bbbb

#vi test2.c 

#include

#include

int main()

;char number[10] = ;

sscanf(str,"%*[^:]:%[^]]][%[^]]",name,number);

printf("name = %s,number = %s\n",name,number);

return 0;

}解釋:

sscanf(str,"%*[^:]:%[^]]][%[^]]",name,number);

1. %*[^:]:%[^]]][%[^]] 可分為3部分理解:①%*[^:] ②:%[^]] ③][%[^]]

1.1  ①%*[^:] 表示:%*跳過,[^:]到**結束,結合起來理解就是跳過直到匹配到第乙個:即結合上面的程式就是跳過了999。

1.2②:%[^]]表示::%從:開始,[^]]到**結束,結合起來理解就是從:開始到直到匹配到]結束,即結合上面的程式就是從:開始到]結束,即值為aaaa。

1.3③][%[^]]表示:][%從][開始,[^]]到**結束,結合起來理解就是從][開始到直到匹配到]結束,即結合上面的程式就是從][到]結束,即值為bbbb。

例 2:

#gcc test2.c -o test

#./test 

user = liman,host = host,cmd = 34234,msg = hello

#vi test2.c 

#include

#include

int main()

解釋:sscanf(buf, "%*d:%*[^:]:%*[^:]:%[^:]:%[^:]:%d:%s", user, host, &cmd, msg);

1. %*d:%*[^:]:%*[^:]:%[^:]:%[^:]:%d:%s有上面的基礎,這個也拆成7部分理解:

1.1%*d 跳過第乙個整數。 //跳過123

1.2:%*[^:]從:開始跳過直到遇到下乙個:之間的值。 //跳過asdfasd

1.3:%*[^:]從:開始跳過直到遇到下乙個:之間的值。 //跳過2342342

1.4:%[^:]取出從:開始直到下乙個:之間的值。//取出liman

1.5:%[^:]

取出從:開始直到下乙個:之間的值。//取出host

1.6:%d取出從:開始的乙個整數值。//取出34234

1.7:%s取出從:開始的乙個字串的值。//取出hello

那麼再回頭看sscanf(pcuserhdr, "%*[^[%[^]]][%[^]]",acusername,acinte***ce);就不是那麼難了。

可以很快看出跳過從開始到第乙個[之間的值,拿出從[開始到下乙個匹配到]的值,拿出從][開始到匹配到下乙個]的值。

3. 正規表示式基本用法:

1、「.」為萬用字元,表示任何乙個字元,例如:「a.c」可以匹配「anc」、「abc」、「acc」;

2、「」,在內可以指定要求匹配的字元,例如:「a[nbc]c」可以匹配「anc」、「abc」、"acc";但不可以匹配「ancc」,a到z可以寫成[a-z],0到9可以寫成[0-9];

3、數量限定符號,表示匹配次數(或者叫做長度)的符號,包括:

「*」  0次或者多次

「+」  1次或者多次

「?」  0次或者1次

「」    匹配n次,n為整數

「」  匹配從n到m之間的某個數的次數;n和m都是整數;

「」   匹配n到無窮次之間任意次數;

「」   匹配0到m之間任意次數;

數量限定符號放到匹配格式的後面,例如:**號碼:024-84820482,02484820482(假設前面3或者4位,後面7或者8位,並且中間的減號可有可無),都是符合規定的,那麼可以用如下格式來匹配:[0-9] \-? [0-9];注意:「\」為轉義字元,因為「-」在正規表示式用有代表乙個範圍的意義,例如:前面所說的[0-9],所以它需要轉義字元「\」進行轉義才可使用;

4、^為否符號,表示不想匹配的符號,例如:[^z][a-z]+可以匹配所有除"z"開頭的以外的所有字

如果^放到的外邊則表示以開頭的字串;^[az][a-z]+表示a或者z開頭的長度大於等於2的英文本串;

正規表示式用法

正規表示式的概念 什麼是 什麼是正規表示式?是html的乙個變種。一般情況下,論壇不允許你使用 而只能用 替代 是一套由流行的 標籤組成了固定 有統一的格式。使用者只要遵循 規則就可以實現使用者想要的功能。如 想要顯示粗體的how are you 字樣,就應該輸入 how are you而不是輸入h...

正規表示式用法

乙個正規表示式就是由普通字元 例如字元 a 到 z 以及特殊字元 稱為元字元 組成的文字模式。該模式描述在查詢文字主體時待匹配的乙個或多個字串。正規表示式作為乙個模板,將某個字元模式與所搜尋的字串進行匹配。將下乙個字元標記為乙個特殊字元 或乙個原義字元 或乙個 後向引用 或乙個八進位制轉義符。例如,...

正規表示式用法

1 正規表示式 理解 1 就是符合一定規則的字串 2 常見規則 a 字元 x 字元 x。舉例 a 表示字元a 反斜線字元。n 新行 換行 符 u000a r 回車符 u000d b 字元類 abc a b 或 c 簡單類 abc 任何字元,除了 a b 或 c 否定 a za z a到 z 或 a到...