正则表达式

正则笔记

记录:

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

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

回到,的例子

 

原文地址:https://www.cnblogs.com/Doner/p/12009822.html