文章目录

  • 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基本语法四-正则表达式相关推荐

  1. perl基本语法--转载

    http://www.cnblogs.com/zhtxwd/archive/2012/03/06/2381585.html 本文介绍从变量类型.操作运算符.控制叙述.子程序.I/O和档案处理. Reg ...

  2. Perl常用语法记录

    Perl常用语法记录 ##包的切换和调用其它包的方式 #package A; #my $a=10;#package B; #print $A::a; #print $a;##local局部标识符的使用 ...

  3. Pocket英语语法---四、should的同义词是谁

    Pocket英语语法---四.should的同义词是谁 一.总结 一句话总结:should表示劝告,建议,命令,其同义词是ought to,should强调主观看法,ought to强调客观要求.在疑 ...

  4. python3.7正则表达式语法_python3正则表达式的几个高级用法

    python3正则表达式的几个高级用法 一. 概述 本文举例说明python3正则表达式的一些高级级法,主要是各类分组,可应用于 1.复杂网页文件中的有用数据 例如,采用爬虫技术取得网页后,对网页内任 ...

  5. LAMP兄弟连原创视频教程(PHP笔记四--正则表达式,文件,目录操作)

    8.1 正则表达式的功能介绍 与正则表达式:是用描述字符排列模式一种语法规则 作用:字符串的模式分割.匹配.查找.替换 正规字符:abcd 13456 特殊字符:() ? ^ $ 原子:(普通字符,如 ...

  6. 正则语法完全正则表达式手册_语法格式重点

    20211202 https://blog.csdn.net/lc11535/article/details/103266263 该表达式打开re.U(re.UNICODE)标志. python –& ...

  7. java 正则表达式语法_Java 正则表达式基础语法

    基础符号 首尾匹配^:匹配输入字符串开始的位置 $:匹配输入字符串结尾的位置 例:"^hello$"含义为该字符串开头必须为h,结尾必须为oprivate static void ...

  8. 英语语法---四种句子类型的介绍

    英语语法 句子-四种句子类型的介绍 1. 陈述句(Declarative Sentence) 1.1 肯定句 1.2 一般否定句 2. 感叹句(Exclamatory) 2.1 What引导的感叹句 ...

  9. javascript知识点整理(四) 正则表达式

    正则表达式 用于定义一些字符串的规则,计算机可以根据正则表达式,来检查字符串是否符合规则,获取字符串中符合规则的内容提取出来. 创建正则表达式对象 语法: var reg=new RegExp(&qu ...

最新文章

  1. 从零开始入门 K8s | 应用配置管理
  2. R语言笔记:快速入门
  3. 分裂的奶牛群(洛谷P2907题题解,Java语言描述)
  4. springboot上传文件同时传参数_Spring Boot 系列:使用 Spring Boot 上传文件
  5. easypoi 列合并_SpringBoot整合EasyPOI实现Excel、Word的导入导出功能
  6. lacp静态和动态区别_静态人脸识别和动态人脸识别有哪些区别
  7. python编写自动化脚本工具_Python自动化构建工具scons使用入门笔记
  8. 网易云音乐java爬虫_用Java实现网易云音乐爬虫
  9. c语言初学者程序,C语言初学者必懂的100个范例程序
  10. ps软件与计算机不兼容怎么办,电脑有Photoshop软件但是却无法打开PSD文件该怎么办-电脑自学网...
  11. 网上商城系统源码 B2C电子商务系统源码
  12. 广义线性模型(GLM)及其应用
  13. CESM优化——Intel编译器编译安装NetCDF库(C+Fortran)
  14. 路线规划算法设计要点
  15. 基于OpenCV的摄像头人脸检测
  16. 多走走弯路,才不会有被剧透的乏味
  17. mysql 枚举字段_MySQL字段中的枚举
  18. tslint pre-commit 配置教程
  19. [源码解析] 深度学习流水线并行GPipe (2) ----- 梯度累积
  20. 计算机专业英语综述,计算机专业的文献综述

热门文章

  1. pre-做前缀的词 整理人:栗子 in zz 参考:英文字根字典by刘毅老师
  2. Unity3D HoloLens2 中文文字转语音即语音合成(语音提示)功能
  3. ADV流速仪坐标系统
  4. 杨元喜院士:《北斗+与综合PNT体系》
  5. 2016年新剧《欢乐颂》里面的经典台词
  6. 主流的知乎口碑营销方式有哪些
  7. 选择低功耗蓝牙芯片时应注意什么
  8. 03-Linux系统克隆和快照
  9. LightRoom教程——Lr预设如何导入xmp文件?
  10. Mac各服务启动命令