c语言正则表达式

%[ ] 的用法: %[ ] 表示要读入一个字符集合 , 如果 [ 后面第一个字符是 ”^” ,则表示反意思。

                     [ ] 内的字符串可以是 1 或更多字符组成。空字符集( %[] )是违反规定的,可

                     导致不可预知的结果。 %[^] 也是违反规定的。          

%[a-z] 读取在 a-z 之间的字符串,如果不在此之前则停止,如

      char s[]="hello, my friend” ;         // 注意 : , 逗号在不 a-z 之间

      sscanf( s, “%[a-z]”, string ) ; // string=hello

%[^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 个字符

%[^=]     读取字符串直到碰到 ’=’ 号, ’^’ 后面可以带更多字符 , 如:

       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 点最致命,越复杂的功能往往执行效率越低下。而一些简单的字符串分析我们可以自已处理。

#include<stdio.h>

int main()
{
    //例1:从<sip:tom@172.18.1.133>中提取tom  
    const char* url = "<sip:tom@172.18.1.133>";
    char uri[10] = {0};
    sscanf(url, "%*[^:]:%[^@]", uri);
    printf("%s\n", uri);

    //例2:从iios/12DDWDFF@122中提取 12DDWDFF  
    const char* s = "iios/12DDWDFF@122";
    char buf[20];
    sscanf(s, "%*[^/]/%[^@]", buf);
    printf("%s\n", buf);

    int k;
    sscanf( "AAA123BBB456" , "%*[^0-9]%i" , &k) ;
    printf("%d\n",k);
    return 0;
}

caoming@caoming-PC:~/share$ gcc hehe.cpp
caoming@caoming-PC:~/share$ ./a.out
tom
12DDWDFF
123

posted @ 2017-10-27 09:58  牧 天  阅读(1119)  评论(0)    收藏  举报