sscanf正则表达式用法简介

简介

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

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

  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

posted @   DreamEagle  阅读(1855)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示