zoukankan      html  css  js  c++  java
  • 正则表达式

    正则笔记

    记录:

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

    第一章 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后面 都匹配到了+ ' 位置可以替换.

    回到,的例子

     

  • 相关阅读:
    c:forTokens标签循环输出
    jsp转long类型为date,并且格式化
    spring中@Param和mybatis中@Param使用区别(暂时还没接触)
    734. Sentence Similarity 有字典数组的相似句子
    246. Strobogrammatic Number 上下对称的数字
    720. Longest Word in Dictionary 能连续拼接出来的最长单词
    599. Minimum Index Sum of Two Lists两个餐厅列表的索引和最小
    594. Longest Harmonious Subsequence强制差距为1的最长连续
    645. Set Mismatch挑出不匹配的元素和应该真正存在的元素
    409. Longest Palindrome 最长对称串
  • 原文地址:https://www.cnblogs.com/Doner/p/12009822.html
Copyright © 2011-2022 走看看