sscanf高级用法级正则表达式

 摘自:https://www.cnblogs.com/bluestorm/p/6864540.html

sscanf与scanf类似,都是用于输入的,只是后者以屏幕(stdin)为输入源,前者以固定字符串为输入源。

函数原型:

int scanf( const char *format [,argument]... );
其中的format可以是一个或多个:

{%[*] [width] [{h|l|I64|L}]  type|'_'|'\t'|'\n'|非%符号},

注:{a|b|c}表示a,b,c中选一,[d],表示可以有d也可以没有d。

²          width:宽度,一般可以忽略,用法如:

const  char sourceStr[] = "hello, world";

char buf[10] = {0};

sscanf(sourceStr, "%5s", buf);   //%5s,只取5个字符

cout << buf<< endl;

结果为:hello

²          {h|I|I64|L}:参数的size,通常h表示单字节size,I表示2字节 size, L表示4字节size(double例外),l64表示8字节size。

²          type :这就很多了,就是%s,%d之类。

²          特别的:%*[width] [{h|l|I64|L}]type 表示满足该条件的被过滤掉,不会向目标参数中写入值。如:

const char sourceStr[] = "hello, world";

char  buf[10] = {0};

sscanf(sourceStr, "%*s%s", buf);

//%*s表示第一个匹配到的%s被过滤掉,即hello被过滤了

cout << buf<< endl;

结果为:world

²          支持集合操作:

%[a-z]  表示匹配a到z中任意字符,贪婪性(尽可能多的匹配)

%[aB']  匹配a、B、'中一员,贪婪性

%[^a]   匹配非a的任意字符,贪婪性

和正则表达式很相似,而且仍然支持过滤,即可以有%*[a-z]。

例子:

1. 常见用法。

char buf[512] = {0};

sscanf("123456 ", "%s", buf);

printf("%s\n", buf);

结果为:123456

2. 取指定长度的字符串。如在下例中,取最大长度为4字节的字符串。

sscanf("123456 ", "%4s", buf);

printf("%s\n", buf);

结果为:1234

3. 取到指定字符为止的字符串。如在下例中,取遇到空格为止字符串。

sscanf("123456 abcdedf", "%[^ ]", buf);

printf("%s\n", buf);

结果为:123456

4.  取仅包含指定字符集的字符串。如在下例中,取仅包含1到9和小写字母的字符串。

sscanf("123456abcdedfBCDEF", "%[1-9a-z]", buf);

printf("%s\n", buf);

结果为:123456abcdedf

5.  取到指定字符集为止的字符串。如在下例中,取遇到大写字母为止的字符串。

sscanf("123456abcdedfBCDEF", "%[^A-Z]", buf);

printf("%s\n", buf);

结果为:123456abcdedf

6、给定一个字符串iios/12DDWDFF@122,获取 / 和 @ 之间的字符串,先将 "iios/"过滤掉,再将非'@'的一串内容送到buf中

sscanf("iios/12DDWDFF@122", "%*[^/]/%[^@]", buf);

printf("%s\n", buf);

结果为:12DDWDFF

7、给定一个字符串““hello, world”,仅保留world。(注意:“,”之后有一空格)

sscanf(“hello, world”,  "%*s%s",  buf);

printf("%s\n", buf);

结果为:world

%*s表示第一个匹配到的%s被过滤掉,即hello被过滤了,如果没有空格则结果为NULL。

8分隔字符串2006:03:18:

int a, b, c;

sscanf("2006:03:18", "%d:%d:%d", a, b, c);

9分隔字符串2006:03:18 - 2006:04:18:

char sztime1[16] = "", sztime2[16] = "";

sscanf("2006:03:18 - 2006:04:18", "%s - %s", sztime1, sztime2);

10分隔字符串2006:03:18-2006:04:18:

char sztime1[16] = "", sztime2[16] = "";

sscanf("2006:03:18-2006:04:18", "%[0-9,:] - %[0-9,:]", sztime1, sztime2);

仅仅是取消了‘-’两边的空格,却打破了%s对字符串的界定format-type中有%[]这样的type field。如果读取的字符串,不是以空格来分隔的话,就可以使用%[]。%[]类似于一个正则表达式。[a-z]表示读取a-z的所有字符,[^a-z]表示读取除a-z以外的所有字符。

sscanf的功能很类似于正则表达式, 但却没有正则表达式强大,所以如果对于比较复杂的字符串处理,建议使用正则表达式.

正则表达式的基本用法:

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为整数

“{n,m}”  匹配从n到m之间的某个数的次数;n和m都是整数;

“{n,}”   匹配n到无穷次之间任意次数;

“{,m}”   匹配0到m之间任意次数;

数量限定符号放到匹配格式的后面,例如:电话号码:024-84820482,02484820482(假设前面3或者4位,后面7或者8位,并且中间的减号可有可无),都是符合规定的,那么可以用如下格式来匹配:[0-9]{3,4} \-? [0-9]{7,8};注意:“\”为转义字符,因为“-”在正则表达式用有代表一个范围的意义,例如:前面所说的[0-9],所以它需要转义字符“\”进行转义才可使用;

4、^为否符号,表示不想匹配的符号,例如:[^z][a-z]+可以匹配所有除"z"开头的以外的所有字

如果^放到[]的外边则表示以[]开头的字符串;^[az][a-z]+表示a或者z开头的长度大于等于2的英文字符串;

5、“|”或运算符,例如:a[n|bc|cb]c可以匹配“abcc”,“anc”,“acbc”;

6、“$”以它前面的字符结尾的;例如:ab+$就可以被“abb”,“ab”匹配;

7、一些简单表示方法:\d表示[0-9];\D表示[^0-9];\w表示[A-Z0-9];\W表示[^A-Z0-9];\s表示[\t\n\r\f],就是空格字符包括tab,空格等等;\S表示[^\t\n\r\f],就是非空格字符;

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/msgsnd/archive/2008/02/26/2122440.aspx

sscanf高级用法级正则表达式的更多相关文章

  1. Web Scraper 高级用法——利用正则表达式筛选文本信息 | 简易数据分析 17

    这是简易数据分析系列的第 17 篇文章. 学习了这么多课,我想大家已经发现了,web scraper 主要是用来爬取文本信息的. 在爬取的过程中,我们经常会遇到一个问题:网页上的数据比较脏,我们只需要 ...

  2. sscanf()的用法

    头文件 #include 定义函数 int sscanf (const char *str,const char * format,........); 函数说明             sscanf ...

  3. 再谈Newtonsoft.Json高级用法

    上一篇Newtonsoft.Json高级用法发布以后收到挺多回复的,本篇将分享几点挺有用的知识点和最近项目中用到的一个新点进行说明,做为对上篇文章的补充. 阅读目录 动态改变属性序列化名称 枚举值序列 ...

  4. C语言函数sscanf()的用法

    从文件读取数据是一件很麻烦的事,所幸有sscanf()函数. C语言函数sscanf()的用法 sscanf() - 从一个字符串中读进与指定格式相符的数据. 函数原型: int sscanf( st ...

  5. fw:sed的高级用法

    转的,找不到原创了.... sed高级用法 <收藏> 首先,应该明白模式空间的定义.模式空间就是读入行所在的缓存,sed对文本行进行的处理都是在这个缓存中进行的.这对接下来 的学习是有帮助 ...

  6. SQL[连载3]sql的一些高级用法

    SQL[连载3]sql的一些高级用法 SQL 高级教程 SQL SELECT TOP SQL SELECT TOP 子句 SELECT TOP 子句用于规定要返回的记录的数目. SELECT TOP ...

  7. Git log高级用法

    格式化Log输出 首先,这篇文章会展示几种git log格式化输出的例子.大多数例子只是通过标记向git log请求或多或少的信息. 如果你不喜欢默认的git log格式,你可以用git config ...

  8. git log 高级用法

    转自:https://github.com/geeeeeeeeek/git-recipes/wiki/5.3-Git-log%E9%AB%98%E7%BA%A7%E7%94%A8%E6%B3%95 内 ...

  9. Linux tar命令高级用法——备份数据

    Linux tar命令高级用法——备份数据 2015-12-31 Linux学习 Linux上有功能强大的tar命令,tar最初是为了制作磁带备份(tape archive)而设计的,它的作用是把文件 ...

随机推荐

  1. css 字体英文对照

    宋体: SimSun 黑体: SimHei 华文细黑: STHeiti Light [STXihei] 华文黑体: STHeiti 微软雅黑: Microsoft YaHei 微软正黑体: Micro ...

  2. date.js

    /** * 此JS文件是格式化JS中日期时间的工具类,其中包含了传入日期对象Date,格式化成想要的格式,<br> * 或者传入字符串格式的时间个,次字符串日期对应的格式可以转换为相应的日 ...

  3. CentOS 7 安装 Nodejs npm 及版本冲突解决

    JC&BC 笔记: 可能没安装过 npm 的人会有点疑惑,安装 npm 跟安装 nodejs 有什么关系? 安装 npm 其实就是安装 nodejs 的过程.这一点官方说的很明白,npm 依赖 ...

  4. Go - 常量与运算符

    常量的定义 1. 常量的值在编译的时候就已经确定.所以,在定义的时候就必须赋值 2. 使用 const 关键字来声明常量.赋值形式与变量类似: // 标准定义 const PI int = 3.14 ...

  5. ORACLE删除字段(set unused的用法)

    一.问题 现场有一张大数据量的分区表,数据量在10G以上.因某种原因需要删除其中的某些字段.如果直接用 alter table1 drop (column1,column2); 或者alter tab ...

  6. [POJ] Palindrome

    Palindrome Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 62102   Accepted: 21643 Desc ...

  7. 走了很多弯路的CCScrollView

    最近在学习Cocos2d-x,学习CCScrollView的时候走了很多弯路,决定记录下来. 学习cocos2d-x的最大的困惑就是资料不是很齐全,网上有很多资料,但是版本差异大,其次深度低,讲解不够 ...

  8. mysql 更改密码

    Mac 安装mysql时会生成一个默认密码: 这个可以在通知中找到,如果你需要更改密码则继续看下面, 今天给mac安装了MySQL,安装过程非常的顺利,但是在用一个可视化工具进行连接时,需要输入密码, ...

  9. [Z] 一些关于http服务器架构设计的资料

    开始关注这块儿,先从最基础最简单的入手.这里放一些我看过的觉得可以收藏的资料,主要是网页或博客,经典书籍之类有时间再看吧: 风格之争:Coroutine模型 vs 非阻塞/异步IO(callback)

  10. msql修改密码

    修改的用户都以root为列.一.拥有原来的myql的root的密码: 方法一:在mysql系统外,使用mysqladmin# mysqladmin -u root -p password " ...