社区
新手乐园
帖子详情
C语言怎么用正则表达式?
szqh97
2011-07-16 05:16:05
如题。
...全文
1032
4
打赏
收藏
C语言怎么用正则表达式?
如题。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
4 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
xunxun
2011-07-16
打赏
举报
回复
lz可以考虑gnulib的regex
djjlove_2008
2011-07-16
打赏
举报
回复
编译原理范畴了,比较难。
cqltwslt
2011-07-16
打赏
举报
回复
以前看到的,可以看看
%[ ] 的用法: %[ ] 表示要读入一个字符集合 , 如果 [ 后面第一个字符是 ”^” ,则表示反意思。
[ ] 内的字符串可以是 1 或更多字符组成。空字符集( %[] )是违反规定的,可
导致不可预知的结果。 %[^] 也是违反规定的。
%[a-z] 读取在 a-z 之间的字符串,如果不在此之前则停止,如
char s[]="hello, my friend” ; // 注意 : , 逗号在不 a-z 之间
sscanf( s, “%[a-z]”, string ) ; // string=hello
/*sscanf()是从缓存区s读取数据到string中;而scanf,fscanf是从标准输入文件(stdin)和
用户自定义文件中读取格式化数*/
%[^a-z] 读取不在 a-z 之间的字符串,如果碰到 a-z 之间的字符则停止,如
char s[]="HELLOkitty” ; // 注意 : , 逗号在不 a-z 之间
sscanf( s, “%[^a-z]”, string ) ; // string=HELLO
%*[^=] 前面带 * 号表示不保存变量。跳过符合条件的字符串。
char s[]="notepad=1.0.0.1001" ;
char szfilename [32] = "" ;
int i = sscanf( s, "%*[^=]", szfilename ) ; // szfilename=NULL, 因为没保存
int i = sscanf( s, "%*[^=]=%s", szfilename ) ; // szfilename=1.0.0.1001
%40c 读取 40 个字符
The run-time
library does not automatically append a null terminator
to the string, nor does reading 40 characters
automatically terminate the scanf() function. Because the
library uses buffered input, you must press the ENTER key
to terminate the string scan. If you press the ENTER before
the scanf() reads 40 characters, it is displayed normally,
and the library continues to prompt for additional input
until it reads 40 characters
%[^=] 读取字符串直到碰到 ’=’ 号, ’^’ 后面可以带更多字符 , 如:
char s[]="notepad=1.0.0.1001" ;
char szfilename [32] = "" ;
int i = sscanf( s, "%[^=]", szfilename ) ; // szfilename=notepad
如果参数格式是: %[^=:] ,那么也可以从 notepad:1.0.0.1001 读取 notepad
使用例子:
char s[]="notepad=1.0.0.1001" ;
char szname [32] = "" ;
char szver [32] = “” ;
sscanf( s, "%[^=]=%s", szname , szver ) ; // szname=notepad, szver=1.0.0.1001
总结: %[] 有很大的功能,但是并不是很常用到,主要因为:
1 、许多系统的 scanf 函数都有漏洞 . ( 典型的就是 TC 在输入浮点型时有时会出错 ).
2 、用法复杂 , 容易出错 .
3 、编译器作语法分析时会很困难 , 从而影响目标代码的质量和执行效率 .
个人觉得第 3 点最致命,越复杂的功能往往执行效率越低下。而一些简单的字符串分析我们可以自已处理。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/liexusong/archive/2010/09/02/5858751.aspx
补充:
sscanf,scanf,fscanf中的正则表达式C/C++ 2010-11-26 09:19:36 阅读145 评论0 字号:大中小 订阅 .
整理自:http://baike.baidu.com/view/1364018.htm
每种语言都对正则表达式有着不同程度的支持,在C语言中,有输入功能的这三个函数对正则表达式的支持并不强大,但是我们还是有必要了解一下。
首先来看看他们的原型:
#include <stdio.h>
int scanf(const char *format, ...);
int fscanf(FILE *stream, const char *format, ...);
int sscanf(const char *str, const char *format, ...);
均可以接受变参,sscanf与scanf类似,可以将标准输入(stdin)作为输入源。最关键的部分,就是format这个参数了。它可以是一个或者多个 {%
[width] [{h | l | I64 | L}]type | ' ' | '\t' | '\n' | 非%符号}。
参数解释:
1、 * 亦可用于格式中, (即 %*d 和 %*s) 加了星号 (*) 表示跳过此数据不读入. (也就是不把此数据读入参数中) 2、{a|b|c}表示a,b,c中选一,[d],表示可以有d也可以没有d。 3、width表示读取宽度。 4、{h | l | I64 | L}:参数的size,通常h表示单字节size,I表示2字节 size,L表示4字节size(double例外),l64表示8字节size。 5、type : 就是%s,%d之类。 6、特别的:%*[width] [{h | l | I64 | L}]type 表示满足该条件的被过滤掉,不会向目标参数中写入值
支持的集合操作:%[a-z] 表示匹配a到z中任意字符,贪婪性(尽可能多的匹配)%[aB'] 匹配a、B、'中一员,贪婪性%[^a] 匹配非a的任意字符,贪婪性
返回值
这三个函数返回成功匹配和分配的输入项。意思就是你在format参数列表中的格式,返回值可以比你提供的匹配项目数少(有些将会匹配失败)。提前匹配失败则返回0。如果达到文件末尾,则返回EOF,当发生错误的时候也将返回EOF。你可以通过输出errno来查看错误代码。
如果使用fscanf来判断文件是否结束,将会存在安全隐患,如果每次读取的时候都是匹配失败,那么返回值永远都不会是EOF。scanf族的函数都是要先将数据读入缓冲区,然后在冲缓冲里读取。
注意:scanf族函数会忽略一行开始的空白。
至善者善之敌
2011-07-16
打赏
举报
回复
http://www.chinaunix.net/jh/23/303346.html
C语言
正则表达式
库
C语言
正则表达式
库,兼容perl的
正则表达式
库,使用简介、方便
c语言
版本
正则表达式
pdf版
c语言
版本
正则表达式
大家可以来下载 高清版
C语言
实现
正则表达式
检测
在编写
c语言
遇见串口输入合法性检测,需要符合
正则表达式
,java等其它语言可以使用现成库,但
c语言
需要自己编写其模块,该模块已经成功使用多次,希望你对你有用~
linux下的
C语言
POSIX
正则表达式
头文件和源文件: regex.h regex.cpp
linux下posix标准的
正则表达式
库,支持regcomp, regexec等,可以放到vs2010或vs2012下进行编译。
C语言
正则表达式
使用详解
正则表达式
是编程技术中比较复杂的一个,掌握起来相对困难,但在数据检索等到高级编程中又几乎离不开。本文非常详细地介绍了
c语言
正则表达式
的各种用法。
新手乐园
33,311
社区成员
41,784
社区内容
发帖
与我相关
我的任务
新手乐园
C/C++ 新手乐园
复制链接
扫一扫
分享
社区描述
C/C++ 新手乐园
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章