正则表达式规则及C语言测试代码

正则表达式规则

规则数据来源于runoobcom,如果侵权,请告知删除,谢谢。

-非打印字符

字符 描述
\f 匹配一个换行符,等价于\x0x和\cL
\n 匹配一个换行符,等价于\0x0a和\cJ
\r 匹配一个回车符,等价于\x0d和\cM
\t 匹配一个制表符,等价于\0x09和\cl
\v 匹配一个垂直制表符,等价于\x0b和\cK
\s 匹配任何空白字符,包括空格、制表符、换行符等等,等价于[\f\n\r\t\v]
\S 匹配任何非空白字符,等价于[^ \f\n\r\t\v]

-特殊字符
正则表达式规则及C语言测试代码_第1张图片

-限定符

字符 描述
{n} n 是一个非负整数。匹配确定的 n 次。例如,’o{2}’ 不能匹配 “Bob” 中的 ‘o’,但是能匹配 “food” 中的两个 o。
{n,} n 是一个非负整数。至少匹配n 次。例如,’o{2,}’ 不能匹配 “Bob” 中的 ‘o’,但能匹配 “foooood” 中的所有 o。’o{1,}’ 等价于 ‘o+’。’o{0,}’ 则等价于 ‘o*’。
{n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,”o{1,3}” 将匹配 “fooooood” 中的前三个 o。’o{0,1}’ 等价于 ‘o?’。请注意在逗号和两个数之间不能有空格。
* 匹配前面的子表达式零次或多次,例如,zo*能匹配”zo”以及”zoo”
+ 配前面的子表达式一次或多次。例如,’zo+’ 能匹配 “zo” 以及 “zoo”,但不能匹配 “z”。+ 等价于 {1,}。
匹配前面的子表达式零次或一次。例如,”do(es)?” 可以匹配 “do” 或 “does” 中的”do” 。? 等价于 {0,1}。

*、+限定符都是贪婪的,它们会尽可能多的匹配文字,只要在后面加上?就可以实现非贪婪。
有如下Xml字符串

<H1>Chapter 1 – Introduction to Regular ExpressionsH1>

如果需要匹配标签页需要使用,本例子为H1需要使用

<.*?>           H1>
<.*>            <H1>Chapter 1 – Introduction to Regular ExpressionsH1>

-定位符

字符 描述
^ 匹配输入字符串开始的位置。如果设置了 RegExp 对象的 Multiline 属性,^ 还会与 \n 或 \r 之后的位置匹配。
$ 匹配输入字符串结尾的位置,如果设置了RegExp对象的Muitiline属性,还会与\n或\r之前的位置匹配
\b 匹配一个字边界,即字与空格间的位置。
\B 非字边界匹配

-选择
用圆括号将带选择的项包括进来,里面通过|分隔。
有下面字符串:

<H1>Chapter 1 – Introduction to Regular ExpressionsH1>
可以通过(Ch|ul)a选择出Cha和ula

-其它常用元字符

符号 描述
x|y 匹配 x 或 y。例如,’z|food’ 能匹配 “z” 或 “food”。’(z|f)ood’ 则匹配 “zood” 或 “food”。
[xyz] 字符集合。匹配所包含的任意一个字符。例如, ‘[abc]’ 可以匹配 “plain” 中的 ‘a’。
[^xyz] 负值字符集合。匹配未包含的任意字符。例如, ‘[^abc]’ 可以匹配 “plain” 中的’p’、’l’、’i’、’n’。
[a-z] 字符范围。匹配指定范围内的任意字符。例如,’[a-z]’ 可以匹配 ‘a’ 到 ‘z’ 范围内的任意小写字母字符。
[^a-z] 负值字符范围。匹配任何不在指定范围内的任意字符。例如,’[^a-z]’ 可以匹配任何不在 ‘a’ 到 ‘z’ 范围内的任意字符。
\d 匹配一个数字字符。等价于 [0-9]。
\D 匹配一个非数字字符。等价于 [^0-9]。
\w 匹配包括下划线的任何单词字符。等价于’[A-Za-z0-9_]’。
\W 匹配任何非单词字符。等价于 ‘[^A-Za-z0-9_]’。
\xn 匹配 n,其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如,’\x41’ 匹配 “A”。’\x041’ 则等价于 ‘\x04’ & “1”。正则表达式中可以使用 ASCII 编码。
\num 匹配 num,其中 num 是一个正整数。对所获取的匹配的引用。例如,’(.)\1’ 匹配两个连续的相同字符。
\n 标识一个八进制转义值或一个向后引用。如果 \n 之前至少 n 个获取的子表达式,则 n 为向后引用。否则,如果 n 为八进制数字 (0-7),则 n 为一个八进制转义值。
\nm 标识一个八进制转义值或一个向后引用。如果 \nm 之前至少有 nm 个获得子表达式,则 nm 为向后引用。如果 \nm 之前至少有 n 个获取,则 n 为一个后跟文字 m 的向后引用。如果前面的条件都不满足,若 n 和 m 均为八进制数字 (0-7),则 \nm 将匹配八进制转义值 nm。
\nml 如果 n 为八进制数字 (0-3),且 m 和 l 均为八进制数字 (0-7),则匹配八进制转义值 nml。
\un 匹配 n,其中 n 是一个用四个十六进制数字表示的 Unicode 字符。例如, \u00A9 匹配版权符号 (?)。

C语言使用正则表达式

C语言标准库不支持正则表达式,但POSIX辅助库支持正则表达式,下面为C语言测试程序,测试环境为:VirtualBox+ubuntu 15.10
如下为代码:

#include 
#include 

#define NMATCH 1
#define PRINTFMATCH

int main(int argc, char *argv[])
{
    char patten[512] = {'\0'};
    char buf[512] = {'\0'};

    regmatch_t pm[NMATCH];

    memset(pm, 0, sizeof(regmatch_t) * NMATCH);
    regex_t reg;
    int j,t,iRet;

    printf("input regexStr:");
    scanf("%s", patten);

    regcomp(®, patten, REG_EXTENDED);

    while(1){
        printf("input srcStr:");
        scanf("%s", buf);

        if(0 == strcmp(buf, "quit"))
        {
            return 0;
        }

        iRet = regexec(®, buf, NMATCH, pm, REG_NOTBOL);
        printf("srcStr:%s, regexStr:%s, iRet:%d\n", buf, patten, iRet);
        if(REG_NOMATCH == iRet)
        {
            printf("not match\n");
        }
        else{
#ifdef PRINTFMATCH
            for(t = 0; t < NMATCH; t++)
            {
                printf("rm_so:%d, rm_eo:%d\n", pm[t].rm_so, pm[t].rm_eo);
            }
#endif
        }
    }

    return 0;
}

运行结果如下:

root@-VirtualBox:/media/sf_Share/test_c# ./a.out 
input regexStr:a[0-9a-zA-Z]{1,}@[a-z]{2,5}.[a-z]{3}
input srcStr:aaa213y812312@yahoo.com
srcStr:aaa213y812312@yahoo.com, regexStr:a[0-9a-zA-Z]{1,}@[a-z]{2,5}.[a-z]{3}, iRet:0
rm_so:0, rm_eo:23
input srcStr:qqa231231@qq.com
srcStr:qqa231231@qq.com, regexStr:a[0-9a-zA-Z]{1,}@[a-z]{2,5}.[a-z]{3}, iRet:0
rm_so:2, rm_eo:16
input srcStr:quit
root@-VirtualBox:/media/sf_Share/test_c# 

你可能感兴趣的:(正则表达式)