• 第五章 模式匹配


    第五章   模式匹配
     匹配一个字符边界
    
    	 匹配一个普通水平制表字符
    
    /bar{3}/  匹配的是barrr
    
    5.2 模式匹配操作符:
    
    m// 用于匹配一个模式,s///用于将某个符合模式的子字符窜代换为某个子串
    
    每次成功匹配了一个模式(包括替换中的模式),操作符都会把变量$`,$&,$' 分别设置为
    
    匹配内容左边内容,匹配的内容和匹配内容右边的文本。
    
    [oracle@june2 perl]$ cat 1.pl 
    "hot cross buns" =~ /cross/;
    print "Left <$`>
    ";
    
    print "Match <$&>
    ";
    
    print "Right <$'>
    ";
    [oracle@june2 perl]$ perl 1.pl 
    Left <hot >
    Match <cross>
    Right < buns>
    
    为了有更好的颗粒度和提高效率,你可以用圆括弧捕捉你特别想分离出来的部分。
    
    每对圆括弧捕捉与圆括弧内的模式相匹配的子模式。圆括弧由左圆括弧的位置 
    
    从左到右依次排序,对应那些子模式的子字符串在匹配之后可以通过顺序的变量$1,$2,$3
    
    等等获得:
    
    
    [oracle@june2 perl]$ cat 2.pl 
    $_ = "Bilbo Baggins's birthday is September 22";
    /(.*)'s birthday is (.*)/;
    print "Person: $1
    ";
    print "Date: $2
    ";
    [oracle@june2 perl]$ perl 2.pl 
    Person: Bilbo Baggins
    Date: September 22
    
    5.2.1 模式修饰词:
    
    /i 忽略大小写
    [oracle@june2 perl]$ cat 3.pl 
    $_='Abc';
    if  ($_ =~/abc/i){print "1---ok
    "};
    $_='Abc';
    if  ($_ =~/abc/){print "2---ok
    "};
    [oracle@june2 perl]$ perl 3.pl 
    1---ok
    
    /s 让.匹配换行符并且忽略不建议使用的$*变量
    
    [oracle@june2 perl]$ cat 3.pl 
    $_="Abc
    aaaaaaaa";
    if ($_ =~ /abc.a/is){print "1------ok
    "};
    $_="Abc
    aaaaaaaa";
    if ($_ =~ /abc.a/i){print "2------ok
    "};
    [oracle@june2 perl]$ perl 3.pl 
    1------ok
    
    /x添加空格
    m/w+:(s+w+)s*d+/; # 一个词,冒号,空白,词,空白,数字。
    m/w+: (s+ w+) s* d+/x; # 一个词,冒号,空白,词,空白,数字。
    
    m{
    w+: # 匹配一个词和一个冒号。
    ( # 分组开始。
    s+ # 匹配一个或多个空白。
    w+ # 匹配另外一个词。
    ) # 分组结束。
    s* # 匹配零或更多空白。
    d+ # 匹配一些数字
    }x;
    
    [oracle@june2 perl]$ cat 4.pl 
    $_="a: b 3";
    if ($_ =~ m/w+:(s+w+)s*d+/){ print "1---------ok
    "};
    $_="a: b a3";
    if ($_ =~ m/w+:(s+w+)s*d+/){ print "2---------ok
    "};
    $_="a: b 3";
    if ($_ =~ m{
    w+: # 匹配一个词和一个冒号。
    ( # 分组开始。
    s+ # 匹配一个或多个空白。
    w+ # 匹配另外一个词。
    ) # 分组结束。
    s* # 匹配零或更多空白。
    d+ # 匹配一些数字
    }x){print "3---------ok
    "};
    
    /g 全局匹配:
    [oracle@june2 perl]$ cat 5.pl 
    $_ ="abcabc";
    if ($_ =~ s/a/xx/){print "$_ is 1---$_
    "};
    $_ ="abcabc";
    if ($_ =~ s/a/xx/g){print "$_ is 2---$_
    "};
    [oracle@june2 perl]$ perl  5.pl 
    $_ is 1---xxbcabc
    $_ is 2---xxbcxxbc
    
    
    [oracle@june2 perl]$ perl 4.pl 
    1---------ok
    3---------ok
    
    
    
    5.2.2 m// 操作符(匹配)
    
    
    5.3 元字符和元符号
    
    <pre name="code" class="sql">+ 是一个特殊字符,表示匹配"+前边内容一次或多次。
    
    
    s  空白 	 
     
     f
    
    
    w  [a-zA-Z_0-9]  匹配任何单个字符
    
    
    d 数字
    
    
    . 点号 匹配所有的字符,除换行符外
    
    
    d{7,11} 将匹配最少7位数字,但不会多于11位数字。
    
    
    + 代表最少一次
    
    
    *  表示0次或多次
    
    量词原子性含义
    * 否匹配 0 或者更多次数(最大)。
    
    + 否匹配 或者更多次数(最大)。
    
    ? 否匹配 1 或者0次(最大)。
    
    {COUNT} 否匹配COUNT 次
    
    {MIN,} 否匹配至少MIN次(最大)
    。
    {MIN,MAX} 否匹配至少MIN次但不超过MAX次(最大)
    
    *? 否匹配0或者更多次(最小)
    
    +? 否匹配1或者更多次(最小)
    
    ?? 否匹配0或者1次(最小)
    
    {MIN,}? 否匹配最多MIN次(最小)
    
    {MIN,MAX}? 否匹配至少MIN次但不超过MAX次(最小)
    
    ? 表示零或一次
    在perl里你可以强制进行非贪婪匹配,在量词后面加上一个问号来表示最小匹配。
    
    
    我们同样的用户名匹配就可以写成/.*?:/。 这里.*? 现在尽可能少地匹配字符,而不是尽可能多的匹配字符。
    
    .+ 保证至少匹配字串的一个字符
    

  • 相关阅读:
    NetCore+AutoMapper多个对象映射到一个Dto对象
    log4net快速上手
    WebService基于soapheader的身份验证
    Canvas入门笔记-实现极简画笔
    .Net修改网站项目调试时的虚拟目录
    Roslyn导致发布网站时报错:编译失败
    .NET通过字典给类赋值
    键盘测试工具
    索引器基类定义
    自定义队列任务执行器
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13351817.html
Copyright © 2020-2023  润新知