通配符:
. 点号,匹配任何单字符的通配符(除了换行符\n)--------"abcde"=~/abc.d/
* 匹配之前内容零次或者多次
*. 通配所有的字符串,捡破烂模式
+ 通配之前内容1次以上
? 通配前之前内容1次或者0次
分组:
$_="aa11bb";
if (/(.)\g{1}11/) { # 使用\g{num}这种形式,避免\111时出现的错误。 num中,负号代表反向引用;
print "it matched!\n";}
择一匹配:
$name=~/fr(a|e)d/ #a或者e
字符集:
$name=~/HAL-[^0-9]+/ # 脱逸符代表除去0-9的字符集和, 字符集以外的“-”没有意义,无需"/"
简写: \w 单词字符 #a-z、A-Z、0-9、_下划线
\d 匹配数字。
\s 空白字符 #相当于[\f\t\n\r ]五种,换页、制表、换行、回车、空格。
\R 匹配任何类型的断行。
\h 匹配横向空白
\v 匹配纵向空格
大写表示反向匹配
--------------
/i 忽略大小写
/s 匹配任意字符
/x 加入空白
/-?\d+\.?\d*/ #挤在一起,看不清楚
/ -? \d+ \.? \d* /x #加入空白忽略之后,忽略空格
/e 表示将把 <replacemnet> 部分当作一个运算符,这个参数用的不多。
$string = "www22cgi44";
$string =~ s/(\d+)/$1*2/e; # (/d+)代表 $string 中的一个或多个数字字符,将这些数字字符执行 *2 的操作,因此最后 $string 变成了 "www44cgi88"。
锚位:
^ 匹配最前端。
$ 匹配最后端。
^\s*$ 匹配空行
\b 匹配单词边界,在紧挨着\b的这边为固定边界
绑定操作符:
=~ 拿右边的模式匹配左边的字符
$bang=(<STDIN> =~ /\byes\b/i); 将匹配的串赋值给$bang
=~ 操作符的优先级很高:$bang=<STDIN>=~/\bytes\b/i;这样也不用加括号
模式中的变量内插:
$bang=abc;
/^($bang)/
捕获变量:
"hello,ken"=~/(\w+),/ 这里的(\w+)就可以用$1来匹配,如:print $1,输出hello
捕获变量的生命周期: 一般是正确捕获后的值都会存在$1里,并且会被下一次的正确匹配替换
非捕获模式:
"hello,ken"=~/(?:w+),/ 这里就不会将内容匹配到$1.
命名捕获:
"hello,ken.nice to meet you!" =~/(?<name1>\w+),(?:.*) (?<name2>\w+)!/ ##这时,可以在输出语句中拿 $+{name1},$+{name2}调用,如:print $+{name1}; 输出hello
在模式中再次调用标签,可以使用\g{name1}来调用。
%+ 这是一个特殊的哈希,从上面可知,命名匹配的标签都存入到了这个哈希里。
$& 完整展示正则式匹配的内容
$' 匹配之后的字符串
$` 匹配之前的字符串
如:if ("hello there,neighbor"=~/\s(w+),/) {print "$& ;}
输出为:
my $na='hello there, neighbor';
if ($na=~/\s(\w+),/)
{
say $';
say $`;
say $&;}
输出为:
neighbor
hello
there,
匹配次数:
my $na='aaaaaaaaaaaa, neighbor';
if ($na=~/(a{5,10})/) #匹配出现a 5到10次的地方,如果a出现了20次,则只有前10个会匹配,如果省去右边的值,则匹配次数没有上限;如果省去左边的值,变为匹配单独的次数(如只有左边值{5},只有前5个会匹配
{
print $1 ;} # 这里的$1指,第一次匹配的地方,按左括弧计算
优先级:
元括弧 (.....),(?:......),(?<LABEL>.....)
量词 a* a+ a? a{n,m}
锚位 abc a^ a$
择一 a|b|c
元素 a[abc] \d \1
优先级举例:
如:/^abc|bar$/ 匹配开头有abc的,或者匹配结尾有bar的,结尾如果有abc,不匹配
/^(abc|bar)$/ 匹配不管开头或者结尾有abc或者bar的,结尾有abc,也匹配
s///替换
/g全局查找 (/s和/g的不同之处在于,/s虽然可以跨行匹配,但是只能匹配行内第一次出现的匹配项,而/g则可以全部匹配到)
可以使用不同的定界符:s<fred>{bary}
/U将其后的字符转换为大写
/L 将其后的字符转换为小写
/u 大写转换,但只针对其后的一个字符
/l 小心转换,以后一个字符
/E 结束大小写转换效果
/u/L 首字母大写,前后顺序无所谓
Split操作符
@faled=split /:/,”abc:def:g:h” 这时,split会将它们以“:”分割,并且将分割后的项目存入数组,此时,@faled=qw/abc def g h/,如果出现“abc::def”的情况,那么会有一个元素成为空值。
Split默认会以空白字符作为分割$_; 如:@filed=split,等同于split /\s+/,$_
Join 操作符
$x = join “:”,4,5,6,7,8,9; $x为4:5:6:7:8:9;
@values = qw/1 2 3 4 5/;
$empty = join “-” , @values; ##$empty=1-2-3-4-5
$empty = join “abc” , @values; ##$empty=1abc2abc3abc4abc5
上下文中的捕获:
my($first, $second, $third) = /(\S+) (\S+), (\S+)/; ##这样就把三个括号里捕获的内容存入三个变量内;
my %last_name = ($data =~ /(\w+)\s+(\w+)/g);##这样匹配成功后,括号里的内容成对儿的加入到%last_name这个哈希表内。
非贪婪量词:
在贪婪量词后加?,就可以使贪婪量词变为非贪婪量词,如:/.*?/ /.+?/ /a{5,8}?/ /a{8,}?/
跨行模式匹配:
^和$ 锚位加上/m 就可以匹配串内的换行符了。这样^和$就是在说每行的开头还有结尾。
一次更新多个文件:
$^I=.bak; # 这里是钻石操作符专用的变量,可以将打开的文件,先在文件名后添加.bak,然后在新建个文件,将操作后的内容存入新文件内。以此做到备份
#如果该变量为空,则直接修改源文件。
while (<>){ #这里的钻石操作符,有一点需要说明,在读入文件的时候,都是以行为单位读入的,也就是说$_这个值在每次循环时,都读取一行,循环内的操作,也是只针对这一行而已。
s/^abc/edf/gi;
}
将文件名作为参数放在脚本后,使用钻石操作符
命令行使用:
perl –p –i.bak –w –e ‘s/randall/abcdf/g’ fred*.dat
对全部的fred打头的文件名进行操作。
正则匹配测试模板:
while (<>) { chomp;
if (/.../) #这里输入需要测试的正则式;
{
say "$`<$&>$'";
}else{
say "no match";
}
}
如何在一个句子中,匹配最后一个字母是a的单词,如:wilma is a good man 但是要注意,wilma_is_good_man 这种形式的句子出现
答案:
[a-z]*a(?=[_ ])|(?<=[_ ])[a-z]*a\b