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 $1."\n";
    print $2."\n";
    print $3."\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} 指定重复次数的范围, 常用量词可以看做是通用量词的简写.

时间: 2024-08-12 11:22:38

Perl 学习笔记-正则表达式应用篇的相关文章

PERL学习笔记---正则表达式的应用

使用m//匹配 //这是m//(模式匹配)的一种简写.同qw//操作一样,可以使用任何成对的分隔符.因此,可以使用m(fred), m<fred>, m{fred}, m[fred],或者m,fred,, m!fred!, m^fred^,其它非成对的分隔符也可以 不区分大小写:/i if(/yes/i) {#大小写无关 print “In that case, I recommend that you go bowling.\n”;} 匹配任何字符:/s 默认情况下,点(.)不匹配换行符,这

PERL学习笔记---正则表达式

要匹配某个模式(正则表达式)和$_的关系,可以将模式放在正斜线(//)之间,如下:$_ ="yabba dabba doo";if(/abba/){print "It matched!\n";} 表达式/abba/将在$_寻找这四个字母.如果找到,则返回true,在本例中,它出现了不止一次,但结果没什么不同.总之,如果找到了,则匹配上:如果没找到,则没匹配上.由于模式匹配通常返回true 或false,因此经常用在if 或while 的条件表达式部分.所有在双引号中

嵌入式学习笔记008-裸奔篇之串口

串口是个好东西,前几篇裸奔程序由于没有串口,自己调试都是有led等来表示的,比较"苦逼",终于可以用串口了~~~,这里主要采用上一篇博文(嵌入式学习笔记007-裸奔篇之定时器),也就是串口也是用中断实现的,而且也只是在前一篇博文增加串口的初始化uart0_init(),以及在中断处理函数增加对串口的处理.只要稍微改造前一篇博文就是一个通用的中断处理程序! 这里主要实现在串口输入一个字符,接受后+2再发送到串口,所以在串口输入a 会返回c---. 由于code都有相应的注释,读者自行查看

ZMAN的学习笔记之Python篇:装饰器

年前工作事务比较繁琐,我只能用零碎的时间继续学习Python,决定开一个系列的博文,作为自己深入学习Python的记录吧.名字也取好了,就叫<ZMAN的学习笔记之Python篇>~开篇是关于装饰器的,春节假期码的字哈哈~就让我们开始吧! 本文的例子都是自己想的,如果不是很合适,请大家提出宝贵意见哈~谢谢啦! 一.为什么要用“装饰器” 比如我们写了如下一段代码: # 打印0~99 def func(): for i in range(100): print(i) 我们想要监测执行这个函数花费了多

Java快速教程--vamei 学习笔记(基础篇)

链接:http://www.cnblogs.com/vamei/archive/2013/03/31/2991531.html java快速教程第1课 从HelloWorld到面向对象 学习网址:http://www.cnblogs.com/vamei/archive/2013/03/14/2958654.html java快速教程第2课 方法与数据成员 学习网址:http://www.cnblogs.com/vamei/archive/2013/03/25/2964430.html java快

现代C++学习笔记之一入门篇:智能指针(C++ 11)

原始指针:通过new建立的*指针 智能指针:通过智能指针关键字(unique_ptr, shared_ptr ,weak_ptr)建立的指针 在现代 C++ 编程中,标准库包含智能指针,该指针用于确保程序不存在内存和资源泄漏且是异常安全的. 在现代 C++ 中,原始指针仅用于范围有限的小代码块.循环或者性能至关重要且不会混淆所有权的 Helper 函数中. 1 void UseRawPointer() 2 { 3 // Using a raw pointer -- not recommended

设计模式学习笔记(目录篇)

设计模式学习笔记(目录篇) 为了方便查看,特此将设计模式学习笔记系列单独做一个目录. 1   设计模式学习笔记(一:命令模式) 2   设计模式学习笔记(二:观察者模式) 3   设计模式学习笔记(三:装饰模式) 4   设计模式学习笔记(四:策略模式) 5   设计模式学习笔记(五:适配器模式) 6   设计模式学习笔记(六:责任链模式) 7   设计模式学习笔记(七:外观模式) 8   设计模式学习笔记(八:迭代器模式) 9   设计模式学习笔记(九:中介者模式) 10  设计模式学习笔记(

Java快速教程--vamei 学习笔记(进阶篇)

感谢vamei,学习链接:http://www.cnblogs.com/vamei/archive/2013/03/31/2991531.html Java进阶01 String类 学习链接:http://www.cnblogs.com/vamei/archive/2013/04/08/3000914.html 字符串操作 ---------------------------------------------------------------------------------------

学习笔记-性能测试-工具篇-LR-初识

关于LR的基本信息网上都能搜到,这里就不再赘述. loadrunner的安装准备 windows环境: 前提条件: 内存:2G,硬盘空闲空间10G,安装完成后实际只占不到2G 支持winXP  SP3;32位与64位win7浏览器支持IE6-8,IE9,firefox3 若以前安装过LoadRunner,则将其卸载. 下载好需要的部件然后通过安装程序进行安装 关于破解细节,详情请百度或者谷歌. 这里找到一篇关于LR11的安装篇: http://www.cnblogs.com/yangxia-te

《Mycat学习笔记》 第二篇. MySql 读写分离与日志分析——主从多结点

1    环境说明 接上篇环境   <Mycat学习笔记> 第一篇. MySql 读写分离与日志分析——主从单结点 http://www.cnblogs.com/kaye0110/p/5134588.html 增加一套 mysql 实例,端口为3308 ,通过Binlog方式同步主机情况 localhost : 3306 主机,    在mycat 中配置为 writehost 1 localhost : 3307 从机 a ,在mycat 中配置为 readhost localhost :