sscanf正则表达式用法简介
简介
其实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