元字符:
元字符的含义是具有特殊含义的字符,即为元字符,元字符包括'.',点号能够匹配所有的单字符,但是换行字符除外'\n',
简易量词
记载匹配正则表达式的时候有些需要重复的字符或者字符串,我们在表示这种重复的形式的时候,即是量词,我们知道的量词有'+'表示至少重复一次,'*'表示重复一次或者一次
以上,'?'指的是重复一次或者一次也没有
模式分组
我们使用小括号来作为一个单元来进行匹配,例如/(fred)*/即是检测在$_中是否包含了fred字符串或者没有fred字符串,不管怎么说,fred都是作为一个整体存在的
$_="a1bbd";
#该正则表达式的含义是匹配$_中字符'b'和'a'之间相隔一个字符,或者没有,重点是有字符的话必须是一个
if(/a.b/)
{
print "it amtched 1\n";
}
if(/a.*b/)#该正则表达式的含义是a和b之间有或者没有字符都行,之间字符的数量,和字符是什么都没关系
{
print "it amtched 2\n";
}
if(/a.+b/)#该正则表达式的含义是a和b之间必须有一个或者一个以上字符,该字符是什么没关系
{
print "it matched 3 \n";
}
if(/a.?b/)#该正则表达式的含义是a和b之间必须有一个字符或者没有字符
{
print "it matched 4 \n";
}
反向引用
我们能够使用反响引用圆括号中匹配的文字,即所谓反向引用,而"\1","\2"即是反向引用的写法
$_="abba";
if(/(.)\1/)
{
print"it matched the same character next to the next";
}
而\1则是标明需要匹配连续出现的两个字符,如果没有则匹配失败
反向引用不必一定在圆括号的后面可以是
$_="yabba dabba doo";
if(/y(....) d/1)
{
print "it matched\n";
}
这样就会匹配在y后面的4个非回车字符,是否在d之后还会重复一遍,注意匹配的只是圆括号中的4个非回车字符
出了这样我们还可以嵌套使用反向引用,\2 \1就是这意思
$_="yabba dabba doo";
if(/y(.)(.)\2\1/)#这样匹配的就是abba
{
print "it matched";
}
这样里面的(.)\2意思也是重复一遍,但因为是在\1的里面所以使用了\2
$_="yabba dabba doo";
if(/y((.)(.)\3\2) d\1/)#这样匹配的是yabba dabba
{
print "it matched4\n";
}
#单如果在反向引用的后面需要加上数字怎么办?比如
$_="yaa2";
if(/y(.)\12/)#我想匹配的是yaa2,而不是第十二组
{
print "it matched5\n";
}
#解决问题的思路就是使用g{1}来代替1
if(/y(.)\g{1}2/)
{
print "it matched6\n";
}
择一匹配
$_="john or betty";
if(/john (and|or) betty/)
{
print "it matched1\n";#必须匹配的是john and betty 或者john or betty
}
if(/john( +|\t+)or/)
{
print "it matched2\n";#在john和在or之间必须有一次或者多次以上的空格,或者一次或者多次的水平制表符
}
字符集
字符集指的是遗传可能出现的字符集合,通过写在方括号内来表示[],只是匹配单个字符,但可以是字符集中的任何一个,例如字符集
[abcwxyz],会匹配这7个字符中的任何一个虽然这样也是一样的[a-cw-z],
$_="The HAL-9000 requires authorization to continue";
if(/HAL-[0-9]+/)
{
print "it print string that some model of HAL-compute";
}
但有时候在指定字符以外的字符会比指定字符集以内的字符更容易可以使用^表示出去这些字符以外[^abc]也就是说出去abc以外的字符才行
字符集简写
任意数字的字符集[0-9]可以被简写成\d,因此上面关于HAL-的模式可以匹配成/HAL-\d/
[a-zA-Z0-9_]是使用\w来进行简写的,如果单词中只含有数字,字母和下划线的话,可以使用\w
\s简写擅长处理空白,它相当于[\f\t\n\r]包括5中空白的字符集:换页,制表,换行,及空格我们一般使用\s*来匹配任意数量的空白
还有就是\h简写匹配的是横向空包,也就是[\t ]水平制表符和空格
\v是纵向空白的匹配,[\f\n\r]
\R能够匹配任何类型的断行