简介

其实sscanf 中的筛选条件并不是严格意义上的正则表达式,只能说是正则表达式的简化版本,直接套用正则表达式可能出错。比如:

  1. 正则表达式中星号*、问号?、加号+、{n,m}分别表示匹配≥0、1个、≥1、n~m个字符,而sscanf中默认匹配任意多个满足条件的字符,直到遇到不满足条件的字符(即相当于默认只有正则表达式星号* 号的功能),不可再使用星号*、问号?、加号+、{n,m}

  2. 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个字符
*/

符号说明

  1. % 代表选择,后跟相应条件
  2. %* 代表过滤(即连续匹配满足条件的字符,并丢弃)
  3. %%* 后面紧跟的数字代表匹配的字符个数
  4. %5[^)]代表匹配5个非)的字符,[]内是筛选的条件,^表示否定,如%[a-z]表示接收小写字母,%[A-Z0-9] 表示接收大写字母及数字
  5. 要匹配中间的字符时,应先将前面的字符用%*过滤掉

拓展

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. 字符串在printfscanf中的使用

  • printf("%5.3s",str+2);表示从str[2]开始输出字符串的至多3个字符,输出不足5位则在左侧用空格补足
  • scanf("%3s",str); 从输入流中提取3个字符赋给str

参考资料:https://stackoverflow.com/a/24483494/12634621

版权声明:本文为DreamEagle原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/DreamEagle/p/12553181.html