正则表达式即字符串模式
查看指定字符串中是否有想查找的模式: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,第三行cm//的返回值
在标量环境下只返回是否匹配成功 在列表环境下,若不使用修饰符g,也仅返回是否匹配成功; 使用修饰符g之后,则返回所有匹配结果