zoukankan      html  css  js  c++  java
  • 第五章 模式匹配

    第五章   模式匹配
     匹配一个字符边界
    
    	 匹配一个普通水平制表字符
    
    /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里你可以强制进行非贪婪匹配,在量词后面加上一个问号来表示最小匹配。
    
    
    我们同样的用户名匹配就可以写成/.*?:/。 这里.*? 现在尽可能少地匹配字符,而不是尽可能多的匹配字符。
    
    .+ 保证至少匹配字串的一个字符
    

  • 相关阅读:
    POJ1239
    HDU 2829 四边形不等式优化
    返回数字二进制的最高位位数o(n)
    矩阵快速幂 模板
    HDU4718 The LCIS on the Tree(LCT)
    HDU4010 Query on The Trees(LCT)
    HDU3487 Play With Chains(Splay)
    CF444C DZY Loves Colors
    HDU4836 The Query on the Tree(树状数组&&LCA)
    HDU4831&&4832&&4834
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13351812.html
Copyright © 2011-2022 走看看