• 正则表达式


    正则笔记

    记录:

    在于准确(能做到吗?)。 精炼。 方便回来查找。

    第一章 egrep基本命令

     

    第二章 perl基本命令

    实例:一天的24h

    ([01][0-9]|[2][0-3])  
    或者
    ([0-2][0-3]|[01][4-9])

    perl中

    $foo = (0-9)(1-4)(2-5) $1, $2, $3 = $foo 可以获得对应的值,叫做捕获

    在egrep中 是1 2 3 #写法不同

    (?:)去除位置不捕获,只匹配,提高了性能,但是可读性差了。

    46页(还有10分之9的内容)

    不懂? 怎么可以匹配tab+空格呢。 [tab]* 不是0个以上的tab吗

    (*|tab*)  好像匹配的多把。可以有三个空格

    shell和perl和egrep,好乱

    shell的元字符:空格(分隔命令和参数)和单引号(?)

    字符组效率>多选的效率。

    perl的 字符组内是退格符,是单词分界符。

    用s匹配所有'空白'
    [	]  # 代表制表符
    [s] # 标识所有空白符:空格符/制表符/换行符/回车符  
    [s*] 比 [ ]*   (更容易理解) 写法也不一样

    i是修饰符.=告诉perl不区分大小写.不是正则的一部分(修饰符) 而是m/.../结构的一部分.

    结果错误:

    代码问题:

    代码修改:

    最终程序版本:

    本章总结:

    1.不同工具都有不同的正则流派.perl和egrep可能一个流派.但是p的元字符更多. python...类似p

    2.perl 用 $variable =~ m/regex/ 来判断正则是否匹配.m表示匹配. /表示边界(不属于正则) .整个测试语句作为一个单元,返回TRUE或者FALSE

    3.元字符--特殊意义字符==定义并不统一. 之前shell和双引号引用的字符串的例子中讲过,元字符的含义取决于具体的情况(shell/正则表达式/字符串).

    4.perl和其他流派提供的有用的简记法

    	 制表符
    换行符
    回车符
    s 任何"空白"字符
    S 除s外任意字符
    w [a-zA-Z0-9] 在w+中很用,可匹配一个单词
    W 除w之外的任何字符,yejiushi [^a-zA-Z0-9]
    d [0-9] 即数字
    D 除d外的任何字符

    5./i修饰符标识测试不区分大小写.

    6.(?:...) 用来分组文本,但并不捕获

    7.匹配成功,用$1/$2,之类变量保存响应(..)正则匹配的文本. 能够用正则从字符串中提取信息.

     

    使用正则表达式修改文本

    匹配: $variable =~ m/regex/

    替换: $variable =~ s/.../.../ 改变$variable的文本,(如果找到)

    egrep使用了< >标识单词开始和结束

    perl使用的是和

    $var = ~ s/jeff/jefffref/;

    $var = ~ s/jeff/jefffref/i; 这是什么呢?应该是那样.

    例子:公函生成程序

    修整股票价格

    9.230000000---> 保留两位 9.23

    9.234222222--->9.234 第三位不是0,保留三位

    $price =~ s/(.dd[1-9]?)d*/$1/ 

     

    好像是分割的原理

     

    自动的编辑操作

    由于网速原因,没法打开文件修改sysread字段成read.所以自动化编辑.(好像不是我理解的contrab (linux)有定时)

    处理邮件的小工具

    perl中的

    $var = <> 等于其他语言的getline() # 获取一行内容.

    while ($line=<>)    # <>返回bool

    {处理$line}

    匹配data和reply类似上面的subject

    但是匹配From:el...@ddd.org(The king)

    需要的是后面的,不是全行

    所以 ^From:.(s+) 用s+匹配后面的非文本(就是发送地址) 还要匹配括号内的文字. ()

    ^From:*(s+)) (([^()]*))

    详解:

    if ($line =~ m/^From:(s+)) (([^()]*))/i):
    {
    $reply_address = $1;
    $from_name = $2;
    }

    综合的:

    另种写法:

    $line = ~s/^/|>/;   #就是把文字 iisjdijai--> |> iisjdijai
    print $line;
    真实世界的问题,真实世界的解法

    第一步:

    if (not defined($reply_address) 
    or not defined($from_name)
    ....)
    {
    die 'couldn't glean the required information!';
    }

    检查有没有设置值,die函数发错误信息,退出程序.

    用环视功能为数值添加逗号

    2222222222222 ----> 2,222,222,222,222

    从右到左3的倍数加逗号. -->但, 正则是从左到右处理

    逗号加在 左边有数字,右边数字是3的倍数

    正则表达式特性环视可以解决

    和$相似, 但是环视更常用.

    环视:

    顺序环视顺序(从左到右) 查看文本,尝试匹配子表达式,如果能够匹配,就能返回匹配成功信息. 肯定型顺序环视用特殊的序列(?=....)来表示,例如(?=d) ,他表示如果当前位置右边的字符是数字则匹配成功.

    另一种逆序环视. 从左到右查看文本

    (?<=...) 
    (?<=d)
    左边标识,则匹配成功,紧跟在数字右边的位置
    环视不会'占用'字符

    只是标记位置.

    (?=jeffrey)jeff 可以匹配第二种.但是不可以匹配jefferson

    因为jefferson匹配了jeff,但是jeffrey的位置没有匹配.

    启发:

    (?=jeffrey)jeff 和 jeff(?=rey)是等价的.都可以匹配jeffrey.

    顺序

    jeff?(?=jeffrey) 不会匹配上面的任何一个例子.只会匹配后面紧跟jeffrey的jeff.

    这种形式的:

    jeffs----> jeff's

    1 直接替换 2 用了$1 3用的循环环视 后面's替换

    4 逆序环视+顺序 5 顺序环视+逆序

    3 那个位置有s,则把jeff(s)换成jeff' ---> s不变.不占用

    4 在jeff后面,s前面 都匹配到了+ '

    5 在s前面, jeff后面 都匹配到了+ ' 位置可以替换.

    回到,的例子

     

  • 相关阅读:
    定位中方向余弦矩阵(DCM)简介
    前端UI框架小汇总
    前端知识点小结
    overflow兼容iOS
    使用Flexible实现手淘H5页面的终端适配
    获取当前Javascript脚本文件的路径
    Javascript中document.execCommand()的用法 ( 实现浏览器菜单的很多功能 )
    jquery中的map()方法与js中的map()方法
    js判断是否为移动端
    页面制作注意事项
  • 原文地址:https://www.cnblogs.com/Doner/p/12009822.html
Copyright © 2020-2023  润新知