perl基本语法四-正则表达式
文章目录
- 1.模式匹配
- 2.反向引用
- 3.常用符号
- 4.锚位
- 5.绑定操作符~
- 6.模式串中的内插
- 7.捕获变量
- 1.捕获变量()
- 2.只分组不捕获(?:)
- 3.捕获变量命名(?<>)
- 4.反向引用\g<>或\k<>
- 8.正则表达式的优先级
- 9.用s///进行匹配
- 1.全局替换s///g
- 2.替换中使用的符号
- 10.split函数
- 11.join函数
- 12.上下文中的匹配
- 13.贪婪量词与非贪婪量词
- 14.跨行匹配//mg
- 15.一次性更新多个文件$^I
- 16.正则表达式的特殊变量
- 练习题目
- 1.模式测试程序
- 2.数字的正则表达式
1.模式匹配
使用/ /进行正则匹配
正则表达式符号 | 含义 |
---|---|
元字符. | 匹配除换行符(\n)的任意一个字符 |
量词* | .0-多个 |
量词+ | 1-多个(至少一个) |
量词? | 0-1个(最多一个) |
正则表达式{5} | 5个 |
正则表达式{3,} | 最多3个 |
正则表达式{3,10} | 3-10个 |
2.反向引用
表达式:
(.)(..)\1\2\1
-->(.):任意一个字符
-->(..)任意两个字符
-->\1:表示第一个任意字符,即和(.)相同
-->\2:表示第二个任意字符,即和(..)相同
-->\1:表示第一个任意字符,即和(.)相同
注:其中\1=\g{1};\2=\g{2}
则上面的表达式可以表示为:
(.)(..)\g{1}\g{2}\g{1}
备注:如何区分每个括号对应的第几组,按照左括号依次计数
3.常用符号
常用符号 | 含义 |
---|---|
择一匹配 :|(或) | 如:a|b(匹配a或b) |
[0- 9]=\d | 任意数字 |
[^0-9]=\D | 非数字 |
[^123] | 非123的字符 |
[A-Za-z0-9=\w | 任意字母 |
[^A-Za-z0-9]=\W | 非字母 |
[\t\n\r\f]=\s | 空格 |
[^\s]=\S | 非空格 |
[\d\D] | 任意字符(包括换行符\n) |
/正则表达式/i | 忽略正则表达式的大小写(大小写都行) |
/正则表达式/s | 使元字符(.)包含换行符(\n) |
/正则表达式/x | 忽略正则表达式中的空格 |
注:[\d\D]表示任意字符,包括换行符(\n);
元子符(.)表示任意字符,但是不包括换行符.
4.锚位
/^正则表达式/:正则表达式在字符串开头
/正则表达式$/:正则表达式在字符串结尾
/\b正则表达式\b/:\b表示单词的开头或结尾
/\B正则表达式\B/:\B表示不是单词的开头或结尾
5.绑定操作符~
当变量不是特殊变量$_时,使用绑定操作符~进行正则表达式的匹配
如:$some_other="I dream of betty rubble";
if($some_other=~/\brub/){print "配上了\n";}else{print "没配上\n";}
6.模式串中的内插
my $what=XX;
while(<>){if(/^($what)/){#($what)模式串中的内插; \^为锚位print "we saw $what is the beginning of this input\n";}#$what字符串内插
}
7.捕获变量
1.捕获变量()
捕获变量使用$1/$2/$3…等特殊变量
$_="hello there,neighbor";
if(/\s(\w+),/){print $1;#-->小括号捕获到的变量,$1为特殊变量,一般有几个小括号就有几个$
}if(/(\S+) (\S+), (\S+)/){print "$1 $2 $3\n";#-->捕获到的三个变量
}
2.只分组不捕获(?:)
小括号只用于分组不用于捕获时:(?:)
$_="hello there,neighbor";
if(/(?:\S+) (\S+), (\S+)/){print "$1 $2 $3\n";#-->现在$1=there;$2=neighbor,$3为未定义
}
3.捕获变量命名(?<>)
捕获变量命名(?<user_name>),用户命名在一个特殊哈希%+中
$_="hello there,neighbor";
if(/(?:\S+) (?<name1>\S+), (?<name2>\S+)/){print "$+{name1},$+{name2}\n";
}#-->自定义命名的变量存在特殊哈希%+中
4.反向引用\g<>或\k<>
my $names="fred gates and wilma gates";
if($names=~/(?<laste_name>\w+) and \w+ \g<last_name>/){print "$+{last_name}\n";
}
8.正则表达式的优先级
优先级为:
1.圆括号()
2.量词a* a+ a? a{n,m}
3.锚位和序列 abc ^a a$
4.择一匹配 a|b|c
5.元素 a [abc] \d \1
/^fred|bar$/:锚位的优先级比折一匹配的优先级更高,因此匹配内容为:以fred开头或者以bar结尾
/^(fred|bar)$/:匹配内容为:fred或bar
9.用s///进行匹配
s/查找的正则表达式/替换内容/
$_="one two three";
s/(\w+) (\w+)/$2 $1/;#-->将捕获到的变量交换位置
s/^/huge,/;#-->在字符串的开头插入单词
1.全局替换s///g
$_="home,sweet,home";
s/home/cave/;--->只有第一个home被替换
s/home/cave/g;--->所有的home均被替换$_" one,two ";
s/^\s+|\s+$//g;--->删除字符串开始和结尾的多余空格
普通变量需要使用绑定操作符进行替换~
$content="one two three";
$content=~s/one/two/;
print "$content\n";---->two two three
2.替换中使用的符号
符号 | 含义 |
---|---|
\U | 将匹配到的字符串所有字母变为大写 |
\L | 将匹配到的字符串所有字母变为小写 |
\E | 结束\U\L的作用范围 |
\u | 将匹配到的字符串的第一个字母变为大写 |
\l | 将匹配到的字符串的第一个字母变为小写 |
\u\L | 匹配到的字符串的第一个字母为大写,其余字母为小写 |
$_="I saw Barney with Fred";
s/(fred|barney)/\U$1/gi;#i表示不在乎大小写匹配
print $_;#I saw BARNEY with FRED
s/(fred|barney)/\L$1/gi;
print $_;#I saw barney with fred
10.split函数
split函数:将字符串拆分,得到数组
split /分割符/,分割变量
@field = split /:/,": abc:def:g: :h: : :";--->以冒号分割字符串
foreach(@field){print "$_\n";---->split函数会保留开始和中间的空格,不会保留字符串末尾的空格
}my $some_input="this is a \t test.\n";
my @args=split/\s+/,$some_input;---->以\s+(任意空白)分割字符串$some_input;
foreach(@args){print "$_\n";
}
split默认以空白符拆分特殊变量$_
$_="this is a \t test.\n";
my @args=split;---->以空白分割字符串$_;
foreach(@args){print "$_\n";
}
11.join函数
join函数:将列表合成大字符串
$y=(4,6,8,10,12);
$x=join ":",@y;---->":"可以自己任意定义
print "$x\n";----->$x=4:6:8:10:12;
12.上下文中的匹配
my $test="one 1 two 2 three 3 four 4 five 5";
my @words=($test=~/(\w+)/g);#列表上下文
print "@words\n";
#one 1 two 2 three 3 four 4 five 5my %words=($test=~/(\w+)\s+(\d+)/g);#哈希对
while(my($key,$value)=each %words){print "$key=>$value\n";
}
#five=>5
#one=>1
#three=>3
#two=>2
#four=>4
13.贪婪量词与非贪婪量词
贪婪量词:* + ? {2,10}等等,即平时使用的量词
非贪婪量词:在量词后面加?,即:*? +? ?? {2,10}?
$_="I thougt you said Fred and <BOLD>Velma</BOLD>,not <BOLD>Wlima</BOLD>";
s/<BOLD>(.*)<\/BOLD>/$1/g;#贪婪量词*,贪婪量词*,直接捕获到最末尾,即:I thougt you said Fred and Velma</BOLD>,not <BOLD>Wlima
say;$_="I thougt you said Fred and <BOLD>Velma</BOLD>,not <BOLD>Wlima</BOLD>";
s/<BOLD>(.*?)<\/BOLD>/$1/g;#非贪婪量词*?不会直接捕获到最末尾,即:I thougt you said Fred and Velma,not Wlima
say;
$_="hellooooooooo";
say $1 if /(hello+)/;#贪婪量词+,直接匹配到末尾,即:hellooooooooo
say $1 if /(hello+?)/;#非贪婪量词+部分匹配,即:hello
14.跨行匹配//mg
$_="this is first line\nthis is second line\nthis is third line";
s/^this/that/mg;
print;
#that is first line
#that is second line
#that is third line
15.一次性更新多个文件$^I
my $date=localtime;#当前电脑时间
$^I=".bck";#备份文件
while(<>){s/^(Author:).*/$1XL/i;next if /^Phone/i;#删除phone行s/^(Date:).*/$1$date/i;print;
}
此处更新的原理为:
1.钻石操作符<>识别特殊变量$^I,将文件名改为特殊变量的文件名
2.创建与原来文件一样的文件名,将while循环中的内容print到新文件。如:a.txt(1)a.txt先是被复制为a.txt.bak,然后创建新的a.txt文件(2)while循环中的内容print进新文件,a.txt中的内容被更新
注:钻石操作符读取文件是一行一行读取
16.正则表达式的特殊变量
特殊变量 | 含义 |
---|---|
$& | 所有正则表达式匹配到的内容 |
$’ | 字符串中,正则表达式匹配到的内容,之后的内容 |
$` | 字符串中,正则表达式匹配到的内容,之前的内容 |
$\$&\$'|表示整个字符串,正则表达式调试最常用的方法是:\$ <$&>$’
|
练习题目
1.模式测试程序
模式测试程序:用于检验正则表达式是否正确
while(<>){chomp;
if(/你的正则表达式/){#用于检验正则表达式对不对print "配上了:{$`<$&>$'}\n";
}else{print "没配上!\n";
}
}
2.数字的正则表达式
获取用户输入,判断是否为数字
print "please enter a number:\n";
chomp($_=<STDIN>);
if(/-?\d+\.?\d+/){ #匹配数字的正则表达式
print "the data you enter is a number:$_\n";
}else{print "the data you enter is not a number:$_\n";
}
perl基本语法四-正则表达式相关推荐
- perl基本语法--转载
http://www.cnblogs.com/zhtxwd/archive/2012/03/06/2381585.html 本文介绍从变量类型.操作运算符.控制叙述.子程序.I/O和档案处理. Reg ...
- Perl常用语法记录
Perl常用语法记录 ##包的切换和调用其它包的方式 #package A; #my $a=10;#package B; #print $A::a; #print $a;##local局部标识符的使用 ...
- Pocket英语语法---四、should的同义词是谁
Pocket英语语法---四.should的同义词是谁 一.总结 一句话总结:should表示劝告,建议,命令,其同义词是ought to,should强调主观看法,ought to强调客观要求.在疑 ...
- python3.7正则表达式语法_python3正则表达式的几个高级用法
python3正则表达式的几个高级用法 一. 概述 本文举例说明python3正则表达式的一些高级级法,主要是各类分组,可应用于 1.复杂网页文件中的有用数据 例如,采用爬虫技术取得网页后,对网页内任 ...
- LAMP兄弟连原创视频教程(PHP笔记四--正则表达式,文件,目录操作)
8.1 正则表达式的功能介绍 与正则表达式:是用描述字符排列模式一种语法规则 作用:字符串的模式分割.匹配.查找.替换 正规字符:abcd 13456 特殊字符:() ? ^ $ 原子:(普通字符,如 ...
- 正则语法完全正则表达式手册_语法格式重点
20211202 https://blog.csdn.net/lc11535/article/details/103266263 该表达式打开re.U(re.UNICODE)标志. python –& ...
- java 正则表达式语法_Java 正则表达式基础语法
基础符号 首尾匹配^:匹配输入字符串开始的位置 $:匹配输入字符串结尾的位置 例:"^hello$"含义为该字符串开头必须为h,结尾必须为oprivate static void ...
- 英语语法---四种句子类型的介绍
英语语法 句子-四种句子类型的介绍 1. 陈述句(Declarative Sentence) 1.1 肯定句 1.2 一般否定句 2. 感叹句(Exclamatory) 2.1 What引导的感叹句 ...
- javascript知识点整理(四) 正则表达式
正则表达式 用于定义一些字符串的规则,计算机可以根据正则表达式,来检查字符串是否符合规则,获取字符串中符合规则的内容提取出来. 创建正则表达式对象 语法: var reg=new RegExp(&qu ...
最新文章
- 从零开始入门 K8s | 应用配置管理
- R语言笔记:快速入门
- 分裂的奶牛群(洛谷P2907题题解,Java语言描述)
- springboot上传文件同时传参数_Spring Boot 系列:使用 Spring Boot 上传文件
- easypoi 列合并_SpringBoot整合EasyPOI实现Excel、Word的导入导出功能
- lacp静态和动态区别_静态人脸识别和动态人脸识别有哪些区别
- python编写自动化脚本工具_Python自动化构建工具scons使用入门笔记
- 网易云音乐java爬虫_用Java实现网易云音乐爬虫
- c语言初学者程序,C语言初学者必懂的100个范例程序
- ps软件与计算机不兼容怎么办,电脑有Photoshop软件但是却无法打开PSD文件该怎么办-电脑自学网...
- 网上商城系统源码 B2C电子商务系统源码
- 广义线性模型(GLM)及其应用
- CESM优化——Intel编译器编译安装NetCDF库(C+Fortran)
- 路线规划算法设计要点
- 基于OpenCV的摄像头人脸检测
- 多走走弯路,才不会有被剧透的乏味
- mysql 枚举字段_MySQL字段中的枚举
- tslint pre-commit 配置教程
- [源码解析] 深度学习流水线并行GPipe (2) ----- 梯度累积
- 计算机专业英语综述,计算机专业的文献综述