簡介
其實sscanf 中的篩選條件並不是嚴格意義上的正則表達式,只能說是正則表達式的簡化版本,直接套用正則表達式可能出錯。比如:
-
正則表達式中星號*、問號?、加號+、{n,m}分別表示匹配≥0、1個、≥1、n~m個字符,而sscanf中默認匹配任意多個滿足條件的字符,直到遇到不滿足條件的字符(即相當於默認只有正則表達式星號* 號的功能),不可再使用星號*、問號?、加號+、{n,m}
-
sscanf篩選條件中需要規定匹配字符個數時,應在%或%*后面加上相應數字
用法示例
/*提取字符串括號里的字符*/
#include<cstdio>
#include<cstring>
int main(){
char str[256];
sscanf("First (helloWorld): last","%*[^(](%[^)]%*[^\n]",str);
printf("$%s$\n",str); //輸出$helloWorld$
sscanf("First (helloWorld): last","%*[^(](%5[^)]%*[^\n]",str); //限定5個字符
printf("$%s$\n",str); //輸出$hello$
return 0;
}
/*
%*[^(] 連續匹配非左括號字符First 並丟棄之,遇到左括號停止
( 匹配並丟棄左括號
%[^)] 連續匹配非右括號字符helloWorld(遇到右括號停止)並賦值給str
%*[^\n] 連續匹配非換行符的字符,遇到換行符停止(不接收換行符),這部分可省略,不影響結果
%5[^)] 限定只匹配5個字符
*/
符號說明
%
代表選擇,后跟相應條件%*
代表過濾(即連續匹配滿足條件的字符,並丟棄)%
及%*
后面緊跟的數字代表匹配的字符個數%5[^)]
代表匹配5
個非)
的字符,[]
內是篩選的條件,^
表示否定,如%[a-z]
表示接收小寫字母,%[A-Z0-9]
表示接收大寫字母及數字- 要匹配中間的字符時,應先將前面的字符用
%*
過濾掉
拓展
1. 提取子串
// 讀取行,並提取第一個括號里的子串
#include <stdio.h>
int main() {
char line[256], str[128];
while (fgets(line, sizeof line, stdin)) {
sscanf(line, "%*[^(](%127[^)]", str);
printf("|%s|\n", str);
}
return 0;
}
運行樣例:
one (two) three
|two|
four (five) six
|five|
seven eight (nine) ten
|nine|
2. 字符串在printf
和scanf
中的使用
printf("%5.3s",str+2);
表示從str[2]開始輸出字符串的至多3個字符,輸出不足5位則在左側用空格補足scanf("%3s",str);
從輸入流中提取3個字符賦給str