精华内容
下载资源
问答
  • grep (缩写来自Globally search a Regular Expression and Print)是一种强大的文本搜索工具,它能使用特定模式匹配(包括正则表达式)搜索文本,并默认输出匹配行。Unix的grep家族包括grep、egrep和fgrep。Windows系统...

    grep (缩写来自Globally search a Regular Expression and Print)是一种强大的文本搜索工具,它能使用特定模式匹配(包括正则表达式)搜索文本,并默认输出匹配行。Unix的grep家族包括grep、egrep和fgrep。Windows系统下类似命令FINDSTR。

    grep egrep fgrep(不支持正则表达式)

    grep需要标准输入 因此常常位于管道右侧

    命令参数:

    --color=auto: 对匹配到的文本着色显示

    -v: 显示不被pattern匹配到的行

    -i: 忽略字符大小写

    -n:显示匹配的行号

    -c: 统计匹配的行数

    -o: 仅显示匹配到的字符串

    -q: 静默模式,不输出任何信息

    -A #: after, 后#行

    -B #: before, 前#行

    -C #:context, 前后各#行

    -e:实现多个选项间的逻辑or关系

    grep –e ‘cat ' -e ‘dog' file

    -w:匹配整个单词 数字加字母下划线全都算单词的一部分,其他的都是单词的分隔符

    -E:相当于egrep

    -F:相当于fgrep,不支持正则表达式

    -f: 跟一个文件(写有不同字符)进行内容检索是逻辑or关系

    练习题:

    1、显示三个用户root、centos、arch的UID和默认shell (用户需要自己创建)

    37e43e9dcd0335da169464b59e58e1fa.png

    2、找出/etc/rc.d/init.d/functions文件中行首为某单词(包括下划线)后面跟一 个小括号的行

    adc920fa24f0ed3809ed4ee7af5e6dec.png

    3、使用egrep取出/etc/rc.d/init.d/functions中其基名

    ab99577f38d1636b4f7554e561e10bba.png

    4、使用egrep取出上面路径的目录名

    05176fc26f6fb88264e0bff61b799618.png

    5、统计last命令中以root登录的每个主机IP地址登录次数

    7780ba99e7a69ae675ed2f2483f3a3b6.png

    6、利用扩展正则表达式分别表示0-9、10-99、100-199、200-249、250-255

    0-9: [0-9]

    10-99: [1-9][0-9]

    100-199: 1[0-9][0-9]

    200-249: 2[0-5][0-9]

    250-255: 25[0-5]

    7、显示ifconfig命令结果中所有IPv4地址

    f8da954610852b1c51ae41f2141eb806.png

    8、将此字符串:welcome to centos linux 中的每个字符排序,重复 次数多的排到前面

    165daf066ff6cdf07b3613e2a05c6628.png

    正则表达式:

    REGEXP:由一类特殊字符及文本字符所编写的模式,其中有些字符(元字符) 不表示字符字面意义,而表示控制或通配的功能

    程序支持:grep,sed,awk,vim, less,nginx,varnish等

    分两类:

    基本正则表达式:BRE

    扩展正则表达式:ERE

    grep -E, egrep

    正则表达式引擎:

    采用不同算法,检查处理正则表达式的软件模块

    PCRE(Perl Compatible Regular Expressions)

    元字符分类:字符匹配、匹配次数、位置锚定、分组

    man 7 regex

    字符匹配:

    . 匹配任意单个字符 默认是贪婪匹配

    [] 匹配指定范围内的任意单个字符 .在里面也是点不需要转义

    [^] 匹配指定范围外的任意单个字符

    [:alnum:] 字母和数字

    [:alpha:] 代表任何英文大小写字符,亦即 A-Z, a-z

    [:lower:] 小写字母

    [:upper:] 大写字母

    [:blank:] 空白字符(空格和制表符)

    [:space:] 水平和垂直的空白字符(比[:blank:]包含的范围广)

    [:cntrl:] 不可打印的控制字符(退格、删除、警铃...)

    [:digit:] 十进制数字

    [:xdigit:]十六进制数字

    [:graph:] 可打印的非空白字符

    [:print:] 可打印字符

    [:punct:] 标点符号

    匹配次数:用在要指定次数的字符后面,用于指定前面的字符要出现的次数

    * 匹配前面的字符任意次,包括0次

    贪婪模式:尽可能的匹配符合条件的字符

    .* 任意长度的任意字符

    \? 匹配其前面的字符0或1次

    \+ 匹配其前面的字符至少1次

    \{n\} 匹配前面的字符n次

    \{m,n\} 匹配前面的字符至少m次,至多n次

    \{,n\} 匹配前面的字符至多n次

    \{n,\} 匹配前面的字符至少n

    位置锚定:定位出现的位置

    ^ 行首锚定,用于模式的最左侧

    $ 行尾锚定,用于模式的最右侧

    ^PATTERN$ 用于模式匹配整行

    ^$ 空行

    ^[[:space:]]*$ 空白行

    \< 或 \b 词首锚定,用于单词模式的左侧

    \> 或 \b 词尾锚定;用于单词模式的右侧

    \ 匹配整个单词

    分组:\(\) 将一个或多个字符捆绑在一起,当作一个整体进行处理,如: \(root\)\+

    分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,

    这些变量的命名方式为: \1, \2, \3, ...

    \1 表示从左侧起第一个左括号以及与之匹配右括号之间的模式所匹配到的字符

    示例: \(string1\+\(string2\)*\)

    \1 :string1\+\(string2\)*

    \2 :string2

    后向引用:引用前面的分组括号中的模式所匹配字符,而非模式本身

    或者:\|

    示例:a\|b: a或b C\|cat: C或cat \(C\|c\)at:Cat或cat

    扩展的正则表达式:

    egrep = grep -E

    egrep [OPTIONS] PATTERN [FILE...]

    扩展正则表达式的元字符:

    字符匹配:

    . 任意单个字符

    [] 指定范围的字符

    [^] 不在指定范围的字符

    次数匹配:

    *:匹配前面字符任意次

    ?: 0或1次

    +:1次或多次

    {m}:匹配m次

    {m,n}:至少m,至多n次

    位置锚定:

    ^ :行首

    $ :行尾

    \

    \>, \b :语尾

    分组:

    () 后向引用:\1, \2, ...

    或者:

    a|b: a或b C|cat: C或cat (C|c)at:Cat或cat

    练习题:

    1、显示/proc/meminfo文件中以大小s开头的行(要求:使用两种方法)

    6ed76e6ce66c189edfc0558a885632e8.png

    2、显示/etc/passwd文件中不以/bin/bash结尾的行

    4cfece0a29443a13523132bb4e96ae45.png

    3、显示用户rpc默认的shell程序

    e241a74bd00dbc9f8a86dfa5df342d87.png

    4、找出/etc/passwd中的两位或三位数 (只要数字的话可以加-o选项仅仅显示数字)

    1ad228d60d52c890dc0423eaf47257a6.png

    5、显示CentOS7的/etc/grub2.cfg文件中,至少以一个空白字符开头的且后面有非 空白字符的行

    3f2149a83be2f6da8694f26b716ce2d1.png

    6、找出“netstat -tan”命令结果中以LISTEN后跟任意多个空白字符结尾的行

    13918906ff977a60d4bd34c952604b90.png

    7、显示CentOS7上所有系统用户的用户名和UID

    e0ffdad5ba49ef4ca074a33acf997cfd.png

    8、添加用户bash、testbash、basher、sh、nologin(其shell为/sbin/nologin),找 出/etc/passwd用户名和shell同名的行

    6ea03d296059cf8299026baab2c50cc1.png

    9、利用df和grep,取出磁盘各分区利用率,并从大到小排序

    b6360024397eb953aa8e24c3f0e8edf3.png

    grep和正则表达式参数

    一:grep参数

    1,-n  :显示行号

    0bbb2493e0d945e90d0d0a70f8193c95.png

    2,-o  :只显示匹配的内容

    c339752dceb9bf8a357c5c9e95f71004.png

    3,-q  :静默模式,没有任何输出,得用$?来判断执行成功没有,即有没有过滤到想要的内容

    4,-l  :如果匹配成功,则只将文件名打印出来,失败则不打印,通常-rl一起用,grep -rl 'root' /etc

    8064b70c6e4716905ca4549f9546eb93.png,

    5,-A  :如果匹配成功,则将匹配行及其后n行一起打印出来

    ddad1d619fc9bd0cbbea9773b6d8a42a.png

    6,-B  :如果匹配成功,则将匹配行及其前n行一起打印出来

    e172205eb5aca1611697043c9ff92cb5.png

    7,-C  :如果匹配成功,则将匹配行及其前后n行一起打印出来

    3bfe3c2c8bdbe87aad8b065dbe42d0c9.png

    8,-c  :如果匹配成功,则将匹配到的行数打印出来

    9fb914ef20ee517752e18766b99965d6.png

    9,-E  :等于egrep,扩展

    10,-i  :忽略大小写

    11,-v  :取反,不匹配

    12,-w:匹配单词

    二:正则介绍

    首先建a.txt。在进行验证

    195d48a5fa6c7fcfe77a80616e2b8cfc.png

    1,^ 行首

    85d37e14e9fc1a60df7fe228f50ae264.png

    2,$行尾

    09d6d46a527270f4b883d98228119133.png

    3,.除了换行符以外的任意单个字符

    7d952fb080f813e8565fd2b3f4adc082.png

    4,*前导字符的零个或多个

    224ea1867a07dddc081ca25f4217079f.png

    5, .*所有字

    6, []字符组内的任一字符

    1c3abe8823bb3245f261b563dac0ac61.png

    7,[^]对字符组内的每个字符取反(不匹配字符组内的每个字符)

    cbff8392fa4f67d4b82c9e548b288285.png

    8,  ^[^]非字符组内的字符开头的行

    c4b689b710e87b7b7a5d32a11ee7dd41.png

    9,[a-z] 小写字母

    6f15d7b38555c1777093fd0a4e509cb4.png

    10,[A-Z] 大写字母

    2804512406dc7ca2021e1818a07f47c6.png

    11,[a-Z] 小写和大写字母

    d800a4fdbc203494e10122c330df8966.png

    12,[0-9] 数字

    b9ad4bf6b75279c779db39712ba0d148.png

    13,\

    \>单词尾

    7536f33bbfe55d118fc667998d96f1b7.png

    4e19a4368c798e7b53a11051cfe9ba28.png

    以上就是linux grep与正则表达式使用介绍的详细内容,更多关于grep和正则表达式参数的资料请关注脚本之家其它相关文章!

    展开全文
  • 在上一篇文章中讲述了正则表达式使用方法,正则表达式的难度还是比较大的,如果不花足够多的时间去做的话还是比较难的,所以今天就来分享比正则简单的内容,方便大家接下来的学习。 XPath常用规则 XPath的规则是...

    使用XPath

    XPath,全称XML Path Language,即XML路径语言,它是在XML语言中查找信息的语言。它最初是用来搜寻XML文档的,但是它同样适用于HTML文档的搜索。

    在上一篇文章中讲述了正则表达式的使用方法,正则表达式的难度还是比较大的,如果不花足够多的时间去做的话还是比较难的,所以今天就来分享比正则简单的内容,方便大家接下来的学习。

    XPath常用规则

    XPath的规则是非常丰富的,本篇文章无法一次性全部概括,只能为大家介绍几个常用的规则。

    表达式 描述
    nodename 选取此节点的所有子节点
    / 从当前节点选取直接子节点
    // 从当前节点选取子孙节点
    . 选取当前子节点
    .. 选取当前节点的父节点
    @ 选取属性

    准备工作

    在使用之前得先安装好lxml这个库,如果没有安装请参考下面的安装方式。

    pip install lxml
    

    案例导入

    现在通过实例来xpath对网页解析的过程

    from lxml import etree
    
    
    text = '''
    <div>
        <ul>
            <li class="item-0"><a href="link1.ht
    展开全文
  • 正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在c语言中,用regcomp、regexec、regfree 和regerror处理正则表达式。处理正则表达式分三步:编译正则表达式,regcomp;匹配正则表达式,...

    正则表达式,又称正规表示法、常规表示法(英语:Regular Expression,在代码中常简写为regex、regexp或RE)。正则表达式是使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。

    在c语言中,用regcomp、regexec、regfree 和regerror处理正则表达式。处理正则表达式分三步:

    编译正则表达式,regcomp;

    匹配正则表达式,regexec;

    释放正则表达式,regfree。

    函数原型

    /*

    函数说明:Regcomp将正则表达式字符串regex编译成regex_t的形式,后续regexec以此进行搜索。

    参数说明:

    Preg:一个regex_t结构体指针。

    Regex:正则表达式字符串。

    Cflags:是下边四个值或者是他们的或(|)运算。

    REG_EXTENDED:使用POSIX扩展正则表达式语法解释的正则表达式。如果没有设置,基本POSIX正则表达式语法。

    REG_ICASE:忽略字母的大小写。

    REG_NOSUB:不存储匹配的结果。

    REG_NEWLINE:对换行符进行“特殊照顾”,后边详细说明。

    返回值:

    0:表示成功编译;

    非0:表示编译失败,用regerror查看失败信息

    */

    int regcomp(regex_t *preg, const char *regex, int cflags);

    /*

    函数说明: Regexec用来匹配正则文本。

    参数说明:

    Preg:由regcomp编译好的regex_t结构体指针,

    String:要进行正则匹配的字符串。

    Nmatch:regmatch_t结构体数组的大小

    Pmatch:regmatch_t结构体数组。用来保存匹配结果的子串位置。

    regmatch_t结构体定义如下

    typedef struct {

    regoff_t rm_so;

    regoff_t rm_eo;

    } regmatch_t;

    rm_so,它的值如果不为-1,表示匹配的最大子串在字符串中的起始偏移量,rm_eo,表示匹配的最大字串在字符串的结束偏移量。

    Eflags: REG_NOTBOL和REG_NOTEOL为两个值之一或二者的或(|)运算,稍后会介绍。

    返回值:

    0:表示成功编译;

    非0:表示编译失败,用regerror查看失败信息

    */

    int regexec(const regex_t *preg, const char *string, size_t nmatch, regmatch_t pmatch[], int eflags);

    /*

    函数说明:用来释放regcomp编译好的内置变量。

    参数说明:

    Preg:由regcomp编译好的regex_t结构体指针。

    */

    void regfree(regex_t *preg);

    /*

    函数说明:Regcomp,regexec出错时,会返回error code并且为非0,此时就可以用regerror得到错误信息。

    参数说明:

    Errcode:Regcomp,regexec出错时的返回值

    Preg:经过Regcomp编译的regex_t结构体指针。

    Errbuf:错误信息放置的位置。

    errbuf_size:错误信息buff的大小。

    */

    size_t regerror(int errcode, const regex_t *preg, char *errbuf, size_t errbuf_size);

    示例一

    #include

    #include

    #include

    #include

    int main (void)

    {

    char ebuff[256];

    int ret;

    int cflags;

    regex_t reg;

    cflags = REG_EXTENDED | REG_ICASE | REG_NOSUB;

    char *test_str = "Hello World";

    char *reg_str = "H.*";

    ret = regcomp(&reg, reg_str, cflags);

    if (ret)

    {

    regerror(ret, &reg, ebuff, 256);

    fprintf(stderr, "%s\n", ebuff);

    goto end;

    }

    ret = regexec(&reg, test_str, 0, NULL, 0);

    if (ret)

    {

    regerror(ret, &reg, ebuff, 256);

    fprintf(stderr, "%s\n", ebuff);

    goto end;

    }

    regerror(ret, &reg, ebuff, 256);

    fprintf(stderr, "result is:\n%s\n", ebuff);

    end:

    regfree(&reg);

    return 0;

    }

    编译,输出结果:

    [root@zxy regex]# ./test

    result is:

    Success

    匹配成功。

    示例二

    如果我想保留匹配的结果怎么操作?那就得用到 regmatch_t 结构体了。重新改写上边代码,这时就不能用REG_NOSUB选项了,代码如下:

    #define _GNU_SOURCE

    #include

    #include

    #include

    #include

    #include

    int main (void)

    {

    int i;

    char ebuff[256];

    int ret;

    int cflags;

    regex_t reg;

    regmatch_t rm[5];

    char *part_str = NULL;

    cflags = REG_EXTENDED | REG_ICASE;

    char *test_str = "Hello World";

    char *reg_str = "e(.*)o";

    ret = regcomp(&reg, reg_str, cflags);

    if (ret)

    {

    regerror(ret, &reg, ebuff, 256);

    fprintf(stderr, "%s\n", ebuff);

    goto end;

    }

    ret = regexec(&reg, test_str, 5, rm, 0);

    if (ret)

    {

    regerror(ret, &reg, ebuff, 256);

    fprintf(stderr, "%s\n", ebuff);

    goto end;

    }

    regerror(ret, &reg, ebuff, 256);

    fprintf(stderr, "result is:\n%s\n\n", ebuff);

    for (i=0; i<5; i++)

    {

    if (rm[i].rm_so > -1)

    {

    part_str = strndup(test_str+rm[i].rm_so, rm[i].rm_eo-rm[i].rm_so);

    fprintf(stderr, "%s\n", part_str);

    free(part_str);

    part_str = NULL;

    }

    }

    end:

    regfree(&reg);

    return 0;

    }

    编译,输出结果:

    [root@zxy regex]# ./test

    result is:

    Success

    ello Wo

    llo W

    咦??????我明明只要一个匹配结果,为什么会打印两个出来呢???????

    原来regmatch_t数组的第一个元素是有特殊意义的:它是用来保存整个正则表达式能匹配的最大子串的起始和结束偏移量。所以我们在设置regmatch_t数组个数的时候一定要记住,它的个数是最大保留结果数+1。

    REG_NEWLINE、REG_NOTBOL和REG_NOTEOL

    好了,基本的正则运用到此为止了,现在要开始讲讲REG_NEWLINE、REG_NOTBOL和REG_NOTEOL。很多人对这三个参数有所迷惑。我也是,昨天有人问问题,就把自己错误的理解告诉了别人,然后被大神一顿鄙视。我一直认为如果想用^和$这两个匹配模式一定要用到REG_NEWLINE这个参数,其实不然。

    REG_NEWLINE

    首先看下man page对REG_NEWLINE的说明:

    REG_NEWLINE

    Match-any-character operators don't match a newline.

    A non-matching list ([^...]) not containing a newline does not match a newline.

    Match-beginning-of-line operator (^) matches the empty string immediately after a newline, regardless of whether eflags, the execution flags of regexec(), contains REG_NOTBOL.

    Match-end-of-line operator ($) matches the empty string immediately before a newline, regardless of whether eflags contains REG_NOTEOL.

    我英文不好,google翻译之。。

    REG_NEWLINE

    1.匹配任何字符的运算符(比如.)不匹配换行('\n');

    2.非匹配列表([^...])不包含一个换行符不匹配一个换行符;

    3.匹配开始运算符(^)遇到空字符串立即换行,不论在执行regexec()时,eflags是否设置了REG_NOTBOL;

    4.匹配结束运算符($)遇到空字符串立即换行,不论在执行regexec()时,eflags是否设置了REG_NOTEOL;

    不明白说的是什么,程序测之。。

    第一个问题

    代码如下:

    #define _GNU_SOURCE

    #include

    #include

    #include

    #include

    #include

    int main (void)

    {

    int i;

    char ebuff[256];

    int ret;

    int cflags;

    regex_t reg;

    cflags = REG_EXTENDED | REG_ICASE | REG_NOSUB;

    char *test_str = "Hello World\n";

    char *reg_str = "Hello World.";

    ret = regcomp(&reg, reg_str, cflags);

    if (ret)

    {

    regerror(ret, &reg, ebuff, 256);

    fprintf(stderr, "1. %s\n", ebuff);

    goto end;

    }

    ret = regexec(&reg, test_str, 0, NULL, 0);

    regerror(ret, &reg, ebuff, 256);

    fprintf(stderr, "2. %s\n", ebuff);

    cflags |= REG_NEWLINE;

    ret = regcomp(&reg, reg_str, cflags);

    if (ret)

    {

    regerror(ret, &reg, ebuff, 256);

    fprintf(stderr, "3. %s\n", ebuff);

    goto end;

    }

    ret = regexec(&reg, test_str, 0, NULL, 0);

    regerror(ret, &reg, ebuff, 256);

    fprintf(stderr, "4. %s\n", ebuff);

    end:

    regfree(&reg);

    return 0;

    }

    编译,运行结果如下:

    [root@zxy regex]# ./test

    2. Success

    4. No match

    结果很明显:没有加入REG_NEWLINE的匹配成功,加入的匹配不成功。就是说不加入REG_NEWLINE,任意匹配字符(.)包含'n',加入则不包含'n'。

    第二个问题

    代码如下:

    #define _GNU_SOURCE

    #include

    #include

    #include

    #include

    #include

    int main (void)

    {

    int i;

    char ebuff[256];

    int ret;

    int cflags;

    regex_t reg;

    cflags = REG_EXTENDED | REG_ICASE | REG_NOSUB;

    char *test_str = "Hello\nWorld";

    char *reg_str = "Hello[^ ]";

    ret = regcomp(&reg, reg_str, cflags);

    if (ret)

    {

    regerror(ret, &reg, ebuff, 256);

    fprintf(stderr, "1. %s\n", ebuff);

    goto end;

    }

    ret = regexec(&reg, test_str, 0, NULL, 0);

    regerror(ret, &reg, ebuff, 256);

    fprintf(stderr, "2. %s\n", ebuff);

    cflags |= REG_NEWLINE;

    ret = regcomp(&reg, reg_str, cflags);

    if (ret)

    {

    regerror(ret, &reg, ebuff, 256);

    fprintf(stderr, "3. %s\n", ebuff);

    goto end;

    }

    ret = regexec(&reg, test_str, 0, NULL, 0);

    regerror(ret, &reg, ebuff, 256);

    fprintf(stderr, "4. %s\n", ebuff);

    end:

    regfree(&reg);

    return 0;

    }

    编译,运行结果如下:

    [root@zxy regex]# ./test

    2. Success

    4. No match

    结果说明:不加入REG_NEWLINE,在一个不包含'n'的非列表中,'n'是不被认作空白符,加入则'n'是被认作空白符。

    第三个问题

    代码如下:

    #define _GNU_SOURCE

    #include

    #include

    #include

    #include

    #include

    int main (void)

    {

    int i;

    char ebuff[256];

    int ret;

    int cflags;

    regex_t reg;

    cflags = REG_EXTENDED | REG_ICASE | REG_NOSUB;

    char *test_str = "\nHello World";

    char *reg_str = "^Hello";

    ret = regcomp(&reg, reg_str, cflags);

    if (ret)

    {

    regerror(ret, &reg, ebuff, 256);

    fprintf(stderr, "1. %s\n", ebuff);

    goto end;

    }

    ret = regexec(&reg, test_str, 0, NULL, 0);

    regerror(ret, &reg, ebuff, 256);

    fprintf(stderr, "2. %s\n", ebuff);

    cflags |= REG_NEWLINE;

    ret = regcomp(&reg, reg_str, cflags);

    if (ret)

    {

    regerror(ret, &reg, ebuff, 256);

    fprintf(stderr, "3. %s\n", ebuff);

    goto end;

    }

    ret = regexec(&reg, test_str, 0, NULL, 0);

    regerror(ret, &reg, ebuff, 256);

    fprintf(stderr, "4. %s\n", ebuff);

    end:

    regfree(&reg);

    return 0;

    }

    编译,运行结果如下:

    [root@zxy regex]# ./test

    2. No match

    4. Success

    结果说明:不加入REG_NEWLINE,'^'是不忽略'n'的,加入REG_NEWLINE,'^'是忽略'n'的。也就是说:不加入REG_NEWLINE,以'n'开头的字符串是不能用'^'匹配,加入REG_NEWLINE,以'n'开头的字符串是可以用'^'匹配。

    第四个问题

    代码如下:

    #define _GNU_SOURCE

    #include

    #include

    #include

    #include

    #include

    int main (void)

    {

    int i;

    char ebuff[256];

    int ret;

    int cflags;

    regex_t reg;

    cflags = REG_EXTENDED | REG_ICASE | REG_NOSUB;

    char *test_str = "Hello World\n";

    char *reg_str = "d$";

    ret = regcomp(&reg, reg_str, cflags);

    if (ret)

    {

    regerror(ret, &reg, ebuff, 256);

    fprintf(stderr, "1. %s\n", ebuff);

    goto end;

    }

    ret = regexec(&reg, test_str, 0, NULL, 0);

    regerror(ret, &reg, ebuff, 256);

    fprintf(stderr, "2. %s\n", ebuff);

    cflags |= REG_NEWLINE;

    ret = regcomp(&reg, reg_str, cflags);

    if (ret)

    {

    regerror(ret, &reg, ebuff, 256);

    fprintf(stderr, "3. %s\n", ebuff);

    goto end;

    }

    ret = regexec(&reg, test_str, 0, NULL, 0);

    regerror(ret, &reg, ebuff, 256);

    fprintf(stderr, "4. %s\n", ebuff);

    end:

    regfree(&reg);

    return 0;

    }

    编译,运行结果如下:

    [root@zxy regex]# ./test

    2. No match

    4. Success

    结果说明:不加入REG_NEWLINE,'&dollar;'是不忽略'n'的,加入REG_NEWLINE,'&dollar;'是忽略'n'的。也就是说:不加入REG_NEWLINE,以'n'结尾的字符串是不能用'​&dollar;'匹配,加入REG_NEWLINE,以'n'开头的字符串是可以用'​&dollar;'匹配。

    REG_NEWLINE总结

    好,REG_NEWLINE选项测试到此结束。总结下:

    对于REG_NEWLINE选项,1.使用任意匹配符(.)时,任意匹配符不会包含'n';2.对于一个不含有'n'的非列表,会把'n'认作空白符。3.对于以'n'开头或结尾的字符串,会忽略'n'。使'^'和'$'可以使用。

    REG_NOTBOL和REG_NOTEOL

    现在开始说下REG_NOTBOL和REG_NOTEOL,首先看下man page对这两选项的说明:

    REG_NOTBOL

    The match-beginning-of-line operator always fails to match (but see the compilation flag REG_NEWLINE above) This flag may be used when different portions of a string are passed to regexec() and the beginning of the string should not be interpreted as the beginning of the line.

    REG_NOTEOL

    The match-end-of-line operator always fails to match (but see the compilation flag REG_NEWLINE above)

    继续googling。

    REG_NOTBOL

    匹配开始操作符(^)会经常匹配失败(但是要考虑REG_NEWLINE),这个标志被用在当一个字符串的不同位置被传入到regexec()时,这个位置不应该被解释为该整个字符串的开始位置。

    REG_NOTEOL

    匹配结束操作符($)会经常失败(但是要考虑REG_NEWLINE)。(这个标志被用在当一个字符串的不同位置被传入到regexec()时,即使满足匹配结束作符,也不应该被解释为以某字符(串)为结束的)。

    好吧,继续测试,第一个问题代码如下:

    #define _GNU_SOURCE

    #include

    #include

    #include

    #include

    #include

    int main (void)

    {

    int i;

    char ebuff[256];

    int ret;

    int cflags;

    regex_t reg;

    cflags = REG_EXTENDED | REG_ICASE | REG_NOSUB;

    char *test_str = "Hello World\n";

    char *reg_str = "^e";

    ret = regcomp(&reg, reg_str, cflags);

    if (ret)

    {

    regerror(ret, &reg, ebuff, 256);

    fprintf(stderr, "1. %s\n", ebuff);

    goto end;

    }

    ret = regexec(&reg, test_str+1, 0, NULL, 0);

    regerror(ret, &reg, ebuff, 256);

    fprintf(stderr, "2. %s\n", ebuff);

    ret = regexec(&reg, test_str+1, 0, NULL, REG_NOTBOL);

    regerror(ret, &reg, ebuff, 256);

    fprintf(stderr, "4. %s\n", ebuff);

    end:

    regfree(&reg);

    return 0;

    }

    编译,运行结果如下:

    [root@zxy regex]# ./test

    2. Success

    4. No match

    结果说明:不加入REG_NOTBOL,一个字符串的不同位置是可以用'^'进行匹配,加入REG_NOTBOL,则不能进行匹配。

    第二个问题,我实在理解不了了,网上介绍的全是没有经过验证的。。。。。。

    总结

    以上所述是小编给大家介绍的C语言中的正则表达式使用示例详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

    如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

    展开全文
  • 废话不多说了,直接给大家贴正则表达式代码了。function myValid() {var errorMsg = "";var res = true;//拿到要验证的值.var receiveName = $("#receiveName").val();//姓名var receiveMobile = $("#tMobile").val...

    废话不多说了,直接给大家贴正则表达式代码了。

    function myValid() {

    var errorMsg = "";

    var res = true;

    //拿到要验证的值.

    var receiveName = $("#receiveName").val();//姓名

    var receiveMobile = $("#tMobile").val();//手机号

    var validCode = $("#validCode").val();//验证码

    var regName = /^[\ue-\ufa]{,}$/;//验证姓名

    var regMobile = /^[||||][-]\d{}$/;//验证手机

    var regCode = /^\d{}$/;//验证码

    if (!regName.test(receiveName)) {

    errorMsg += "姓名格式不正确;\n\r";

    res = false;

    }

    if (!regMobile.test(receiveMobile)) {

    errorMsg += "手机号格式不正确;\n\r";

    res = false;

    }

    if (!regCode.test(validCode)) {

    errorMsg += "请输入位的数字验证码;\n\r";

    res = false;

    }

    if (!res) {

    $.ligerDialog.error(errorMsg, "错误提示");

    }

    return res;

    }

    下面分享一个非常简单的验证QQ号码的正则表达式。

    代码如下:

    [1-9][0-9]{4,}

    这就是微学网-程序员之家为你提供的"JavaScript中的正则表达式使用及验证qq号码的正则"希望对你有所帮助.本文来自网络,转载请注明出处:http://www.weixuecn.cn/article/12650.html

    展开全文
  • 用户名可能包含中文,中文按2位算源码下载地址:http://www.zuidaima.com/share/1550463222516736.htm1.[代码]验证用户名,支持中英文(包括全角字符)、数字、下划线和减号 (全角及汉字算...import java.util.regex.Ma...
  • <input onkeyup="this.value=this.value.replace(/[^(\d||/.)]/g," ">
  • 什么是正则表达式正则表达式 的英文名是 Regular Expression,不懂为何都翻译为正则表达式,明明翻译为规则表达式更容易让人理解。?? 那么,什么是规则表达式呢?在 向日葵智能 首页,我们看 python 实战项目目录...
  • 由于工作需要对用户提交的数据进行验证,这是一个简单的日期正则验证实例,有需要了解的同学可参考。shell中的if语句需要做一个正则判断,查了一下语法记录之。DATEPATTERN="^[0-9]{4}-[0-9]{1,2}-[0-9]{1,2}$"if [[ ...
  • 最近学习编译原理,要用到正则表达式。本次要学习怎样用java正则表达式正则表达式:可以用来搜索、编辑、处理文本。简书:类库介绍是一个用正则表达式所订制的方式来对字符串进行匹配工作的泛型包。其主要包括三个...
  • REGEXP在mysql是用来执行正则表达式的一个函数像php中的preg之类的函数了,regexp正则函数如果只是简单的查询使用like即可,但复杂的还是需要使用regexp了,下面我们来看看。MySql用户手册建议,在构造简单查询时,...
  • 你的正则表达式没有用,因为你有未转义/分隔符.将以YYYY-MM-DD格式验证日期的正则表达式如下:^(19|20)\d\d[\-\/.](0[1-9]|1[012])[\-\/.](0[1-9]|[12][0-9]|3[01])$它将验证年份从19或20开始,该月份不大于12且不等于...
  • 允许的话要再加上A-Z,所以你可以改这样试试:"^[0-9]+[a-zA-Z]+[0-9]+$"如何用正则表达式表达以数字开头的字符串\b\d\S+用js的正则表达式检测电话号码,要求,必须是1开头,只能是数字,并且是11位数字,这儿正则...
  • 这篇文章主要介绍了SQL 正则表达式及mybatis中使用正则表达式的方法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下mysql 提供的模式匹配的其他类型是使用扩展正则表达式。当你对这类模式进行匹配测试时,...
  • 引言String这个对于程序原来说一定是最熟悉不过的,很多时候我们都习惯去使用String的原生方法去完成查找字符串、替换、删除,而正则表达式由于略显苦涩的语法常常被人忽略,其实很多时候使用正则表达式可以提高不少...
  • 前言使用man grep查看grep的帮助文档,有如下内容:image可以看出,正则表达式由三类,分别是基本的正则表达式(Basic Regular Expression 又叫 Basic RegEx 简称 BREs)扩展的正则表达式(Extended Regular Expression...
  • Qt 正则表达式使用

    2021-11-22 13:37:08
    一、正则表达式简述 正则表达式是对字符串(包括普通字符(例如,a 到 z 之间的...二、在Qt中使用正则表达式 首先使用正则表达式需要添加头文件 #include <QRegExp> 用法一、对 QLineEdit 即输入框添加限制
  • 使用bash regular expressions:re="http://([^/]+)/"if [[ $name =~ $re ]]; then echo ${BASH_REMATCH[1]}; fi编辑 – OP要求解释语法。 Regular expression syntax是一个很大的话题,我无法在这里全面解释,但我...
  • pandas dataframe/series 正则表达式使用 str.match str.contains str.extractpandas.Series.str.matchSeries.str.match(pat, case=True, flags=0, na=nan, as_indexer=False)[source]Deprecated: Find groups in ...
  • mysql提供的模式匹配的其他类型是使用扩展正则表达式。当你对这类模式进行匹配测试时,使用REGEXP和NOT REGEXP操作符(或RLIKE和NOT RLIKE,它们是同义词)。扩展正则表达式的一些字符是:“.”匹配任何单个的字符。一...
  • Python正则表达式如何进行字符串替换实例import res = 'adds23dd56'ss = re.sub(r'\d', '*', s)>>> ss'adds**dd**'python正则表达式替换字符串问题对第1条运行结果有疑问,另一个问题是:如果想要把两个...
  • 1正则表达式用于描述字符串匹配模式。它可以用来检查字符串是否包含某个子字符串,从字符串中提取匹配的子字符串,或者对字符串中匹配的子字符串执行替换操作。很多读者会认为正则表达式是非常神奇和高级的知识。...
  • 正则世界,唯我独尊 编写项目的时候,多多少少都有些验证,用的时候费力气去写或者满世界的找需要的资料太麻烦 就在这里进行汇总记录,后续会不断更新不断完善 ...正则表达式之——手机号码验证.
  • PHP正则表达式使用详解(1)一个正则表达式是一个特定的格式化模式,可以用来找出一个字符串在另一个字符串中的使用情况。几个编程语言,包括Visual Basic,Perl,JavaScript和PHP都支持正则表达式,希望在这篇入门指导...
  • [摘 要]在动态网页设计中,利用正则表达式可以高效、快速地进行开发,本文探讨了在PHP中利用正则表达式进行url地址解析,密码和邮件验证以及文本文件的处理。 [关键词]正则表达式 PHP 动态网页[中图分类号]TP[文献标识...
  • Python使用内置的re库,由于python和正则表达式使用/作为转义符,故为避免歧义在表达式前面加r,内部的字符串默认不转义。 re.match( ) 从字符串的起始位置匹配,匹配成功返回一个匹配的对象,否则返回None re....
  • 1. Kotlin String 正则表达式使用 目标:将字符串中的 XXX 替换为 <font color=#0000ff>XXX</font> 1.1 预备知识 : capturing group 需要用到正则表达式中「捕获组」(capturing group)的概念。下面...
  • 但在我们最常用的办公软件EXCEL中,目前没有可直接使用正则表达式的函数(至少10版本的EXCEL没有),那么今天我就分享下如何在EXCEL中自定义正则函数。 一、提需求 比如,我要拆分下面的字符串: 显然这样的...
  • 3正则表达式3

    2021-03-17 17:40:27
    Java基础--常用正则匹配符号(必背,必须背,死都要背)1、字母:匹配单个字母(1)A:表示匹配字母A;(2)\\:匹配转义字符“\”;(3)\t:匹配转义字符“\t”;(4):匹配转义字符“”;2、一组字符:任意匹配里面的一个...
  • 中文正则表达式匹配问题之正则表达式中文匹配使用方法,这篇文章主要讲如何使用正则匹配中文字符,中文正则表达式的匹配规则不像其他正则规则一样容易记住,下面一起看看这个中文正则表达式是怎么样的。\w匹配的仅仅...
  • 记录下C中的正则表达式及其使用Demo。 一、概述 在c语言中,用regcomp、regexec和regfree: 编译正则表达式,regcomp; 匹配正则表达式,regexec; 释放正则表达式,regfree; 函数原型如下: /* 函数说明:...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 777,288
精华内容 310,915
关键字:

正则表达式的使用

友情链接: dierzhang.zip