记录:
在于准确(能做到吗?)。 精炼。 方便回来查找。
实例:一天的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的\b 字符组内是退格符,是单词分界符。
[\t] # 代表制表符
[\s] # 标识所有空白符:空格符/制表符/换行符/回车符
[\s*] 比 [\t]* (更容易理解) 写法也不一样
i是修饰符.=告诉perl不区分大小写.不是正则的一部分(修饰符) 而是m/.../结构的一部分.
结果错误:
代码问题:
代码修改:
最终程序版本:
本章总结:
1.不同工具都有不同的正则流派.perl和egrep可能一个流派.但是p的元字符更多. python...类似p
2.perl 用 $variable =~ m/regex/ 来判断正则是否匹配.m表示匹配. /表示边界(不属于正则) .整个测试语句作为一个单元,返回TRUE或者FALSE
3.元字符--特殊意义字符==定义并不统一. 之前shell和双引号引用的字符串的例子中讲过,元字符的含义取决于具体的情况(shell/正则表达式/字符串).
4.perl和其他流派提供的有用的简记法
\t 制表符
\n 换行符
\r 回车符
\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使用的是\b和\b
$var = ~ s/\bjeff\b/jefffref/;
$var = ~ s/\bjeff\b/jefffref/i; 这是什么呢?应该是那样.
9.230000000---> 保留两位 9.23
9.234222222--->9.234 第三位不是0,保留三位
$price =~ s/(\.\d\d[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后面 都匹配到了+ ‘
原文:https://www.cnblogs.com/Doner/p/12009822.html