Perl 学习笔记-正则表达式应用篇
1.以 m// 进行匹配
如: m/roger/ , /roger/ 是它的简写; 在说明 qw// 时可以选择使用任何成对的定界符, 对应m//匹配也可以, 如写成: m(roger) m<roger> m{roger} m%roger% 或 m[roger] , 也可以使用非成对定界符.
如果使用 // 作为定界符, 那么前面的m就可以省略, 基本的原则是选择模式中不会出现的符号作为定界符 , 如在写 http:// 的匹配模式时,就可以选用 m{} 作为定界符; 写作: m{^http://} , 否则需要对定界符转义 /^http:\/\//
常见的定界符是花括号, 在编辑器中也可能具有花括号匹配的功能, 所以便于维护.
2.可选修饰符
可选, 也称为开关, 可以成组附加在某个正则表达式结尾的定界符右边, 并改变正则表达式的默认行为.
/i 使模式在匹配时不区分大小写字母
/s 由于 . 号不能匹配换行符, 这个修饰符会将模式中的每个点号按字符集[\d\D]的效果处理, 即匹配任意字符.
/x 可以在模式中加入任意空白字符, 匹配时所有空白符都会被忽略, 所以一般此时要匹配的空白符用 \s , 由于在Perl中注释也是一种空白, 所以还可以在模式里加上注释. #号可以用\#匹配, 同时在注释里面不能有定界符.
$_ = "http://www.baidu\n\n.com/";
$str = "^http://(.)*\.com";
if(m{$str}s){
print "matched!\n"
}
$str2 = '{
-? # 正负
\d+ #整数部分
\.? #小数点
\d+ #小数部分
}x'; $_ = "3.14";
if($str2){
print "matched!\n";
}
可以任意组合以上修饰符, 先后顺序不会影响结果.
3.锚位
^ $ 分别标示字符串的开头和结尾, /^\s*$/ 可以匹配一个空行.
\b 单词边界锚位, 匹配任何单词的首尾 /\broger\b/ 只能匹配单词roger, 在文字处理器搜索命令中, 称为整词搜索模式,这里的单词指由\w字符构成的字符集, 在模式中\b一定是偶数个.
4.绑定操作符 =~
操作符用右边的模式来匹配左边的字符串, 如果没有这个绑定操作, 那么默认绑定$_
绑定操作符优先级高于赋值符
$roger = "This is a string";
$result = "Roger" =~ /roger/i;
if($result){
print $result."\n";
}
5.模式串中的内插
正则表达式中可以进行双引号形式的内插, 如果会发生冲突, 就想在双引号内内插一样, 可以为内插变量加上圆括号,例如当 $roger = "roger|hello" 时, 如果不对它加括号, 内插之后模式将变成 以 roger开头或匹配hello的字符串, 显然有语义错误.
$roger = "roger";
$_ = "Roger hello ";
if(/^$roger.*$/is){ #没有对内插变量加括号, 也能得出正确结果
print "matched!\n";
}
6.捕获变量
当使用括号来对模式串进行分组时, 同时也启动了正则表达式处理引擎的捕获功能, 也就是把括号中模式所匹配的部分字符串暂时记下来的能力, 如果有一对以上的圆括号, 就会有一次以上的捕获, 每个被捕获的对象是原本的字符串, 而不是模式.
捕获到的字符串都是标量, 保存在标量变量中, 第一个为 $1, $2(在这里也可以看出数字也可以作为变量名,但是只在perl内部使用) , 模式里括号有多少对(组), 匹配变量就有多少个.
$_ = "Hello there, neighbor";
if(/(\S+) (\S+), (\S+)/){
print $."\n";
print $."\n";
print $."\n";
}
生命期: 捕获成功--> 下一次捕获成功, 失败的匹配不会影响上次的成功匹配内容.
关闭部分捕获: 在不捕获的分组的括号的左括号前面加上 ?: 以表示这个分组不参与捕获
命名捕捉:管理数字变量比较不方便的时候可以使用; 如: /(?<label1>\w+) (?:and|or) (?<label2>\w+)/ , 此时反向引用也可以使用: \g{label} 的写法.
自动匹配变量:3个特殊的变量, 自动捕获存储. 变量名分别为: $& $` 和 $'
if("Hello there, neighbor" =~ /\s(\w+),/){
# 存放字符串里实际匹配模式的部分
print $&."\n"; # there,注意前面一个空格,后面一个逗号
# 保存匹配部分之前略过的部分
print $`."\n"; #Hello
# 保存匹配部分之后剩下的,从来没有进行匹配的部分
print $'."\n"; # neighbor 注意前面一个空格
# 将这3部分连接起来就会得到原串
print "$`$&$'\n"; #Hello there, neighbor
}
7.通用量词
为了弥补原有的3个量词(? + * )的不足,可以使用通用量词 {m,n} 指定重复次数的范围, 常用量词可以看做是通用量词的简写.
8.元字符优先级

Perl 学习笔记-正则表达式应用篇的更多相关文章
- PERL学习笔记---正则表达式的应用
使用m//匹配 //这是m//(模式匹配)的一种简写.同qw//操作一样,可以使用任何成对的分隔符.因此,可以使用m(fred), m<fred>, m{fred}, m[fred],或者 ...
- perl学习笔记——正则表达式
正则表达式 简单模式:匹配$_中的内容,只需要将模式写在一对斜线(/)中就可以了. 如:#!/usr/bin/env perl use 5.010; $_="yabba dabba doo& ...
- PERL学习笔记---正则表达式
要匹配某个模式(正则表达式)和$_的关系,可以将模式放在正斜线(//)之间,如下:$_ =“yabba dabba doo”;if(/abba/){print “It matched!\n”;} 表达 ...
- Noah的学习笔记之Python篇:命令行解析
Noah的学习笔记之Python篇: 1.装饰器 2.函数“可变长参数” 3.命令行解析 注:本文全原创,作者:Noah Zhang (http://www.cnblogs.com/noahzn/) ...
- Noah的学习笔记之Python篇:函数“可变长参数”
Noah的学习笔记之Python篇: 1.装饰器 2.函数“可变长参数” 3.命令行解析 注:本文全原创,作者:Noah Zhang (http://www.cnblogs.com/noahzn/) ...
- Noah的学习笔记之Python篇:装饰器
Noah的学习笔记之Python篇: 1.装饰器 2.函数“可变长参数” 3.命令行解析 注:本文全原创,作者:Noah Zhang (http://www.cnblogs.com/noahzn/) ...
- ASP.NET Core Web开发学习笔记-1介绍篇
ASP.NET Core Web开发学习笔记-1介绍篇 给大家说声报歉,从2012年个人情感破裂的那一天,本人的51CTO,CnBlogs,Csdn,QQ,Weboo就再也没有更新过.踏实的生活(曾辞 ...
- PHP学习笔记之数组篇
摘要:其实PHP中的数组和JavaScript中的数组很相似,就是一系列键值对的集合.... 转载请注明来源:PHP学习笔记之数组篇 一.如何定义数组:在PHP中创建数组主要有两种方式,下面就让我 ...
- c++学习笔记之封装篇(上)
title: c++学习笔记之封装篇(上) date: 2017-03-12 18:59:01 tags: [c++,c,封装,类] categories: [学习,程序员,c/c++] --- 一. ...
- c++学习笔记之继承篇
title: c++学习笔记之继承篇 date: 2017-03-26 16:36:33 tags: [c++,继承,public,virtual,private,protected] categor ...
随机推荐
- 杂项:Hadoop
ylbtech-杂项:Hadoop Hadoop是一个由Apache基金会所开发的分布式系统基础架构.用户可以在不了解分布式底层细节的情况下,开发分布式程序.充分利用集群的威力进行高速运算和存储.Ha ...
- ping第一包时间过长
一.现象 公司互联网域(说白了就是可以连外网的vlan区域的主机)的几台主机在ping一个合作方提供的域名时,发现在ping 第一个包时,时间特别长,后面第2--N包开始正常.直接ping 该域名对应 ...
- ES6中的新特性
本人最近学习es6一些方法,难免有些手痒,想着能不能将这些方法总结下,如下 1.数组的扩展 1)首先什么是伪数组 无法直接调用数组方法或期望length属性有什么特殊的行为,但仍可以对真正数组遍历方法 ...
- Oracle中的dbms_metadata.get_ddl的用法
当我们想要查看某个表或者是表空间的DDL的时候,可以利用dbms_metadata.get_ddl这个包来查看. dbms_metadata包中的get_ddl函数详细参数 GET_DDL函数返回创建 ...
- Ubuntu无法获得锁 /var/lib/dpkg/lock - open (11: 资源暂时不可用)
结果终端提示:无法获得锁 /var/lib/dpkg/lock - open (11: 资源暂时不可用) E: 无法锁定管理目录(/var/lib/dpkg/),是否有其他进程正占用它?” 解决办法如 ...
- vue设置title和ioc图标
vue设置ioc图标和title 1.ioc图标设置 在根目录中的index.html中引入代码: <link rel="shortcut icon" type=" ...
- 2.redis配置
转自:http://www.runoob.com/redis/redis-tutorial.html Redis 的配置文件位于 Redis 安装目录下,文件名为 redis.conf. 你可以通过 ...
- **解释器全局锁(Global Interpreter Lock)
解释器全局锁(Global Interpreter Lock),即Python为了保证线程安全而采取的独立线程运行的限制,说白了就是一个核只能在同一时间运行一个线程. [解决办法就是多进程和协程(协程 ...
- <转>UNIX 共享内存应用中的问题及解决方法
http://www.ibm.com/developerworks/cn/aix/library/au-cn-sharemem/ 共享内存是一种非常重要且常用的进程间通信方式,相对于其它IPC机制,因 ...
- Spring IOC基础
2.1.1 IOC是什么IOC—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想.在Java开发中,IOC意味着将你设计好的对象交给容器控制,而不是传统的在你的 ...