《精通正则表达式》学习笔记——第2章:入门示例扩展
来源:互联网 发布:dnf 深度优化 2017 编辑:程序博客网 时间:2024/06/06 04:09
学习书籍是中文第三版《精通正则表达式》,作者:(美国)佛瑞德 (Friedl.J.E.F) 译者:余晟
2.1Perl语言的基本使用
- Perl中使用
$
去定义变量,在Perl中对某个字符串进行正则匹配$text =~m/正则表达式/
其中的~m指的是匹配右边的表达式。
2.2 一些基本的例子
输入一个数字(可能是负数或者小数):
/^[+-]?[0-9]+(\.[0-9]*)?$/
perl语言使用
$1
表示元字符\1
,同理$2 $3 ...
表示\2 \3 ...
等元字符,\1
保存第一个括号中的内容,\2
保存第二个括号中的内容,以此内推来看一个示例程序
if($input=~m/^([+-]?[0-9]+)([CF])$/){ #$1保存([+-]?[0-9]+)中的内容,$2保存([CF])中的内容 $num=$1; $type=$2;}
- 嵌套括号
if($input=~m/^([+-]?[0-9]+(\.[0-9]*)?) *([CF])$/){ # 这时候的([CF])的内容使用$3表示 # $1表示([+-]?[0-9]+(\.[0-9]*)?)的内容 # $2表示 (\.[0-9]*)的内容}
非捕获型括号
- (?:…)表示只分组不捕获,如
^([+-]?[0-9]+(?:\.[0-9]*)?) *([CF])$
其中$2将表示的是([CF]),因为处于第二个括号中的?:
表示不捕获计数
- (?:…)表示只分组不捕获,如
\s
匹配所有空白符(如空格,制表符\t
,回车符\r
,换行符\n
等)\S
用来表示除\s
之外的字符类似的还有
\w
匹配[a-z0-9A-Z]
,\d
匹配[0-9],\W
,\D
表示相反情况/i
表示匹配的时候不区分大小写
2.3 使用正则表达式修改文本
Perl中:
$var=~s/John/Jeff/i
可以看出出现两条斜线,第一条斜线后的内容为待匹配内容,第二条斜线后的内容去替换匹配到的内容。i
是指匹配内容的时候不区分大小写不影响替换的内容,即John
的内容不区分大小写,然后替换成Jeff
。~s
表示使用Perl中的替换操作修正股票价格:通常是保留小数点后两位的数字,如果第三位不为0也需要保留,去掉其他数字
- 表达式:
/(\.\d\d[1-9]?)\d*/$1/
- 表达式:
提取邮件主题Subject:的内容
if($line=~m/^Subject:(.*)/i){ $content=$1;}
提取邮件来自者From: name@qq.com (Tom)
/^From: (\S+) \(([^()]*) \)/
其中(\S+)
提取From:之后第一个空格之前的邮箱内容,\(
和\)
对括号转义,提取(Tom)中的Tom的值,[^()]*
指明其中的内容不能再是括号了使用”环视“添加逗号:基本过程就是从右往左数,每次数3位,如果左边还有数字的话就加一个逗号,如123,456,789
- ”顺序环视”从左往右匹配
- “肯定型环视”使用
?=
,如(?=\d)
它表示如果当前位置右边的字符是数字则匹配成功 “逆序环视”使用
?<=
,从右往左顺序环视的例子:将Jeffs变为
Jeff's
,表达式/\bJeff(?=s\b)/Jeff'/g
- 逆序环视的例子:将Jeffs变为
Jeff's
,表达式/(?<=\bJeff)(?=s\b)/'/g
添加逗号的实现方法:
- 使用顺序环视和
$
:/(?=\d)(?=(\d\d\d)+$)/,/g
- 使用逆序环视:
/(?<=\d)(?=(\d\d\d)+(?!\d))/,/g
- 去掉逆序环视:
/(\d)(?=(\d\d\d)+(?!\d))/$1,/g
- 使用顺序环视和
四种类型的环视
- 单词分界符
\b
可表示成(?<=\w)(?!\w)|(?<!\w)(?<=\w)
.意即左边是单词右边不是单词或者左边不是单词右边是单词。
2.4 Text-to-HTML转换
- 处理特殊字符
$text=~s/&/&/g; $text=~s/&/&alt;/g;$text=~s/&/>/g;
- 分隔段落
^\s*$
- 将Email转为超链接
- 不考虑用户名和主机名
$text=~s/\b(username\@hostname)\b/<a href="mailto:$1">$1<\/a>/g
- 用户名和主机名匹配:
/\w[-.\w]*\@\w+(\.\w)*\.(com|edu|info)/
,这里的用户名可以包含-
,.
等字符 - 实际上使用
\w
匹配用户名@主机名不合适,有的系统\w
能匹配非ASCII字母,所以将\w
替换成[0-9a-zA-Z]
好点 - 修饰符
/x
忽略表达式中的空白字符
$text=~s/
\w[-.\w]* #用户名
\@
\w+(\.\w)*\.(com|edu|info) #主机名
/gix
- 不考虑用户名和主机名
- 将HTTP Url转为超链接
$text=~s/ \b ( #这个括号用来捕捉URL http:\/\/ #所以的/都要转义,防止和元字符冲突 [-0-9a-z]+(\.[0-9a-z]+)*\.(com|edu|info) \b #主机名 ( /[-0-9a-z_:&?=+,!%*\@\.\$]* #路径可以由各种字符组成,但是可以不出现 )? ) / <a href="$1">$1<\/a> #要替换的超链接 /gix
- 《精通正则表达式》学习笔记——第2章:入门示例扩展
- 《精通正则表达式》学习笔记——第1章:正则表达式入门
- 学习笔记——精通正则表达式
- -精通正则表达式-第三版-第2章笔记
- 精通正则表达式--正则表达式入门示例拓展(2)总结笔记重点捕获型括号、环视字符
- 《精通正则表达式》学习笔记
- 《精通正则表达式》学习笔记
- 正则表达式学习——精通正则表达式
- C# 从入门到精通 学习笔记1 第2章 使用变量、操作符和表达式
- 精通正则表达式--正则表达式入门(1)总结笔记
- <精通正则表达式>学习笔记 第一章
- javascript学习笔记2-正则表达式入门
- 《c语言从入门到精通》看书笔记——第4章 运算符与表达式
- 《精通正则表达式》读书笔记摘要: 第二章 入门示例拓展(1)
- 《精通正则表达式》笔记
- 精通正则表达式 笔记
- 《精通正则表达式》笔记
- 《精通正则表达式》笔记
- 连接池的工作流程:
- 并发编程六:线程安全与共享资源
- 高性能MySql设计之查询优化(limit优化)
- Jasperreport ireport designer jasperReport设计器在mac os上的使用
- Spring
- 《精通正则表达式》学习笔记——第2章:入门示例扩展
- Java方法重载(Overload)与方法重写(Override)
- 拦截器
- Android性能分析-内存泄漏
- CodeUp-1036 Problem B镂空三角形
- jzoj 2553. 【NOIP2011模拟9.7】射命丸文
- 危险系数题解
- 16.8.14 C组总结
- leetcode_c++:Text Justification(068)