正则表达式即字符串模式
查看指定字符串中是否有想查找的模式: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之后,则返回所有匹配结果