perl系列:正则表达式

正则表达式即字符串模式

查看指定字符串中是否有想查找的模式:m/模式/
    if ("abc" =~ m/a/) {print "t\n";} else {print "f\n";}    #查看"abc"中是否包含"a"
    #注意使用的符号是"=~",而不是"="
    chomp ($_ = <>); if (/a/) {print "t\n";} else {print "f\n";}    #查看输入字符串是否包含a
    #上面这个例子使用了两个默认情况
    #一:在不指定字符串时,模式默认匹配$_
    #二:模式的边界符使用"/"时,可以省略前面的m。同时意味着在使用m的时候,可以选用任意的标点符号,就像qw一样。

替换字符串中符合模式要求的部分:s/模式/字符串/
    $a="abc"; $a =~ s/a/d/; print "$a\n";    #将$a中的a替换为d
    $_ = <>; s/a/d/; print;    #将输入字符串中的a替换为d
    #注意:不能省略s,但边界符可以替换
    #s/模式/字符串/:前面的部分是模式,后面的部分相当于双引号字符串   

分割和连接字符串
1、@a=split /模式/, $a;    #将模式指定的部分作为分隔符,将$a中的字符串切割并存入@a
    匹配部分作为分隔符,不返回。
    若两个分隔符相邻,则产生空字段。split会返回开头的空字段,但会舍弃结尾的空字段。
    @a=split;    #即@a=split /\s+/, $_; split默认使用空白拆分字符串
    @a=split //, $a;    #将$a中的字符串逐个拆分
2、$a=join $b, @a ;    #$b作为连接符,将@a中的各元素连成一个字符串
    @a中的元素少于两个,不会连接。

模式的书写规则
1、量词:表示量词前的东西可以连续出现的次数
    *    #连续出现任意次,包括0次
    +    #连续出现一次以上
    ?    #没有或出现一次
    {5}    #连续出现5次
    {5,10}    #连续出现最少5次,最多10次。注意逗号两边不能有空格。
    {5,}    #至少连续出现5次
    {,5}    #最多连续出现5次
    贪心与非贪心:默认情况下模式会在量词允许范围内,进行最多匹配,当在量词后使用"?"时,会进行最少匹配。
    {5,10}?    #当模式可以匹配6次时,只匹配前5次
2、精确匹配
    /abc/    #只能匹配"abc"
3、通配符
    .    #可以匹配换行符以外的所有单个字符
    .*    #可以匹配任意数目的任意字符
4、模式组:()内的东西当作一个整体
    /ab(china)+d/    #ab和d之间至少有一个china
5、择一匹配:"|"
    /a|c/    #匹配a或c中的任一个
    #n个"|"可对n+1个模式进行选择
6、字符集:[],一个字符集只匹配一个字符
    /[abcd]/    #匹配abcd中的任何一个即可
    /[2-8]/    #可以使用"-"指定范围
    /[^abcd]/    #排除字符集,使用^表示匹配括号内所列字符以外的所有东西
    /\d/    #即/[0-9]/
    /\w/    #即/[A-Za-z0-9_],包括字母、数字、下划线
    /\s/    #代表/\f\t\n\r]/,包括常见不显示的字符,即空白
    /\D/、/\W/、/\S/    #    分别表示/\d/、/\w/、/\s/的反义
7、锚点:用于限定匹配的位置
    ^    #字符串开头
    $    #字符串末尾
    \b    #"\w+"的开头或结尾
    \B    #非"\b"的位置
8、模式修饰符:放在右侧边界符的外边,多个修饰符可联用
    s    #使"."可以匹配换行符
    i    #进行不区分大小写的匹配
    x    #使模式里可以随意添加空白
            #由于注释也属于一种空白,因此复杂模式可分行书写并加注释说明
            #若需匹配空白,可使用\s
    g    #默认匹配只发生一次,但使用g可进行多次匹配。注意下次匹配是从前次匹配结束的位置开始。
    m    #在多行文本中,使锚点"^"和"$"分别表示行首和行尾
    替换也可以使用修饰符,如:s/模式/字符串/sig
9、模式内变量替换
    /$a/    #使用$a的值作为模式
    /ab($a)cd/    #建议使用()将变量围住
10、优先级
    ①();②量词;③除"|"以外的其他字符;④"|"

模式内()的记忆作用
1、()在模式内表示模式组的同时,也记忆了实际匹配到的字符串(注意不是模式)。
    第1对()将其记忆储存在$1中,第n对()将其记忆储存在$n中。该记忆一直维持到下次匹配成功之前。
    这n个()应该在一个模式里,若两个模式都使用了(),则后面模式的$1不会储存前一个模式的记忆。
2、由于()在模式内有记忆效应,因此使用()表示优先级时,需注意对默认变量编号的影响。
    若不需要()的记忆作用,可在"("右侧加上"?:"。例:
        /(?:\w+)\s+(\w+)/    #$1储存第二个括号的匹配内容
3、也可以将()的记忆内容直接赋值于其他变量
    $a=/(\w+)/;
    @a=/(\w+)/g;
    %a=/(\w+)\s+(\w+)/g;

默认匹配记忆变量
    无论模式内是否有(),该模式所匹配到字符串都存储于$&。
    该字符串之前的部分储存于$`,之后的部分储存于$'。
    "abc" =~ /b/; print "$`\n$&\n$'\n";    #第一行a,第二行b,第三行c

m//的返回值
在标量环境下只返回是否匹配成功
在列表环境下,若不使用修饰符g,也仅返回是否匹配成功;
    使用修饰符g之后,则返回所有匹配结果

你可能感兴趣的:(perl系列:正则表达式)