perl中的量词:

*-----------------匹配0或多次
+-----------------匹配1或多次
?-----------------匹配0或1次
{n}-----------------匹配n次
{n,}-----------------匹配至少n次
{n,m}-----------------匹配至少n次,至多匹配m次

perl中的合法断言:

^-----------------匹配行首
+-----------------匹配行尾(或者末尾前的新行)
\A-----------------仅匹配字符串开头
\B-----------------匹配非单词边界
\b-----------------匹配单词边界
\G-----------------仅匹配前一个m//g剩余的内容(仅仅能和/g一起使用)
\Z-----------------仅仅匹配字符串的末尾,或者末尾前的新行
\z-----------------仅仅匹配字符串的末尾
(?=EXPR)-----------如果EXPR可以匹配下一个,则进行匹配
(?!EXPR)-----------如果EXPR不能匹配下一个,则进行匹配
(?<=EXPR)----------如果EXPR可以匹配前一个,则进行匹配
(?<!EXPR)----------如果EXPR不能匹配前一个,则进行匹配

确保用户输入的所有行至少具有20个字符:


print "\n--------------------------(.{20,}) USED-----------------------------\n";
print "Enter:";
while(<>){
if(!m/.{20,}/){
print "Please type longer line!";
}
}
print "\n--------------------------END (.{20,}) USED--------------------------\n";

默认情况下,量词非常贪婪的,这意味着通过创建从当前查找位置开始的合法匹配,它门将返回找到最长的匹配值。


创建正则表达式:引用前一次匹配的向后引用


在相同的表达式中引用前面的匹配:通过反斜线以及数字\1,\2,\3等,来引用相同模式中以前的匹配值。表达式\1代表第一次匹配,\2代表第二次匹配,依次类推。


例如,处理html,并需要确保正在匹配从开始到相应的结束表姐之间的文本,如<A>到<\A>:


print "\n--------------------------('\1') USED-----------------------------\n";
$text="<A>Here is an anchor.<\A>";
if($text=~/<(IMG|A)>[\w\s\.]+<\/\1>/i){
print "Found an image or anchor tag.";
}
print "\n--------------------------END ('\1') USED--------------------------\n";

在数字的前面加入$($1,$2,$3等)而在括号内引用模式之外的匹配。 使用向后引用$1而将单词转换为缩写形式:


print "\n--------------------------($1) USED-----------------------------\n";
$text="<A>Here is an anchor.<\A>";
if($text=~/<(IMG|A)>[\w\s\.]+<\/\1>/i){
print "Found an image or anchor tag.";
}
print "\n--------------------------END ($1) USED--------------------------\n";

Perl的特殊变量$&(引用前一个匹配),$'(引用前一次匹配之后的字符串),$`(引用前一次匹配之前的字符串)。$+引用括号内的最后一次模式匹配


正则表达式扩展:

(?text)---------------------------------------指出是注释。将忽略这个表达式内的文本。
(?;pattern)或者(?imsx-imsx:pattern)------------用(和)对子表达式分组,而不是向后引用。
(?=EXPR)---------------------------------------正预测断言。如果EXPR可以匹配下一个,则进行匹配。
(?!EXPR)---------------------------------------负向后断言,如果EXPR可以匹配上一个,则进行匹配。
(?<=EXPR)--------------------------------------正向后断言,如果EXPR恰好匹配前一个,则进行匹配。
(?<!EXPR)--------------------------------------负向后断言,如果EXPR不能匹配前一个,则进行匹配。
(?{code})--------------------------------------计算Perl代码0的宽度断言。仅在使用use re ‘eval’ pragma 时才匹配。
(?gtpattern)-----------------------------------匹配子字符串,如果定位在给定的位置,也将匹配这个子字符串。
(?(condition)yes-pattern|no-pattern)或(?(condition)yes-pattern)------------指定条件表达式。
(?ismsx-imsx)----------------------------------指定一个或者多个嵌入的模式匹配修饰符。


------------------------------------------------------------Deno--------------------------------------------------


print "\n------------------('$1' '$2' $3 and (?text)') USED----------------\n";
$text="I see you";
$text=~ s/^(? 1st)(\w+) *(? 2nd)(\w+) *(? 3rd)(\w+)/$3 $2 $1/;
print $text;
print "\n-----------------END ('$1 $2 $3 and (?text)') USED-------------------\n";


预测断言:(?=...)和(?!...)


回想断言:(?<=EXPR)和(?<!EXPR)


断言不是匹配本身的组成部分。


print "\n------------------------(?=EXPR) USED-----------------------------\n";
$_="I am going to Paris,London,and Vienna.";
print "Found all three ."if/(?=.*Vienna)(?=.*Paris)(?=.*London)/;
print "\n----------------------(?=EXPR) END-------------------------------\n";
print "\n------------------------(m/^(exit|quit|stop)$/) USED-----------------------------\n";
while(<>){
if(m/^(exit|quit|stop)$/){
print "You typed:$1\n";
exit;
}else{
print "Nothing stored.\n";
}
}
print "\n----------------------(m/^(exit|quit|stop)$/) END-------------------------------\n";
print "\n------------------------(m/^(?:exit|quit|stop)/) USED-----------------------------\n";
while(<>){
if(m/^(?:exit|quit|stop)$/){
if($1){
print "You typed: $1\n";
exit;
}else{
print "Nothing stored.\n";
}
}
}
print "\n----------------------(m/^(exit|quit|stop)/) END-------------------------------\n";


ps:与m//和s///一起使用修饰符


e--------------------------------指出s///的右边是要计算的代码
ee-------------------------------指出s///的右边要计算的字符窜并作为代码运行,然后再次计算它的返回值
g--------------------------------在全局范围内执行所有可能的操作
gc-------------------------------在匹配失败之后,不要重复查找位置
i--------------------------------忽略字母大小写
m--------------------------------让^和$匹配嵌入的\n字母
o--------------------------------仅对模式进行一次编译
s--------------------------------让、字符匹配新行
x--------------------------------忽略模式中的空白,并允许进行注释

--------------------------------------------------Demo----------------------------------------------------------


print "\n---------------------use(m//g) start----------------------\n";
$text="Here is the texxxxxxxt";
while($text=~m/x/g){
print "Found another x.\n";
}
print "\n---------------------use(m//g) end----------------------\n";


PS:每次在标量上下文中使用m//g时,它将记住上一次查找结束的位置,并从那个位置开始。


--------------------------------------------------Demo----------------------------------------------------------


查找由4个字母构成的单词


print "\n---------------------use(m/\w{4}\b/g) start----------------------\n";
@a=("Here is the test"=~m/\w{4}\b/g);
print @a;
print "\n---------------------use(m/\w{4}\b/g) end----------------------\n";

--------------------------------------------------Demo----------------------------------------------------------


用s///g将字符串中的所有匹配值替换:


print "\n---------------------use(s/./*/g) start----------------------\n";
$a="Here is the test";
$a=~s/./*/g;
print $a;
print "\n---------------------use(s/./*/g) end----------------------\n";


用tr///转换字符串


格式:tr/LIST/LIST/


 y/LIST/LIST/


--------------------------------------------------Demo----------------------------------------------------------


使用这个运算符进行文本替换,并用第2个列表中的相应字符来替换第一个列表中的所有字符。下面例子使用字母o替换字符串中的i:


print "\n---------------------use(tr/i/o/) start----------------------\n";
$a="Here is the test";
$a=~tr/i/o/;
print $a;
print "\n---------------------use(tr/i/o/) end----------------------\n";

指定处理字符范围,下面例子将字符串转换为大写形式:


print "\n---------------------use(tr/a-z/A-Z/) start----------------------\n";
$a="Here is the test";
$a=~tr/a-z/A-Z/;
print $a;
print "\n---------------------use(tr/a-z/A-Z/) end----------------------\n";

tr///运算符返回转换次数,下面例子:统计$_中字母x出现的次数,而不影响字符串:


print "\n---------------------use(tr/x/x/) start----------------------\n";
$text="Here is six xxxxxx";
$xcount=($text=~tr/x/x/);
print $xcount."\n";
print $text."\n";
print "\n---------------------use(tr/x/x/) end----------------------\n";

和tr///一起使用修饰符:


perl中可以和tr///一起使用:


c------------------------对查找列表求补


d-----------------------删除没有替换的字符


s-----------------------删除重复的替换字符



匹配单词:


print "\n---------------------use(/(\S+)/) start----------------------\n";
$text="Here is six xxxxxx";
$text=~ m/(\S+)/;
print $text;
print "\n---------------------use(/(\S+)/) end----------------------\n";


匹配单词:\w匹配字母数字和下划线“_”


print "\n---------------------use(/(\w+)/) start----------------------\n";
$text="Here is six xxxxxx";
$text=~ m/(\w+)/;
print $text;
print "\n---------------------use(/(\w+)/) end----------------------\n";