默认情况下,m//运算符尝试匹配指定的模式和$_中的文本。 例如:在用户输入的文本中查找字符串exit(第二个反斜线之后的i修饰符是的模式匹配不区分大小写)。如果在$_中找到exit,则m//返回真;

print"\n---------------------------(m//) Demo------------------------\n";
print "Enter:";
while(<>){
if(m/exit/i){exit;}
}


=~:运算符指定m//运算符查找的字符串。在这里,指定运算符应该查找标量$line,而不是$_。这段代码没有改变$line的值:

print"\n---------------------------(m//) and(=~)Demo------------------------\n";
print "Enter:";
while($line=<>){
if($line=~m/exit/i){exit;}
}


!~:运算符对=~的返回值取反。

print"\n---------------------------(m//) and(=~) (!)Demo------------------------\n";
print "Enter:";
while($line=<>){
if(!($line=~m/exit/i)){exit;}
}


m//运算符使用频繁,可以忽略掉m部分,多数程序使用如下快捷方式:

print "\n---------------------------(m//)and(=~) (!) Demo------------------------\n";
print "Enter:";
while($line=<>){
if($line=~/exit/i){exit;}
}

与其他perl运算符一样,如果你不喜欢斜线,可以使用自己的定界符,在这种情况下必须使用m;

 

print"\n---------------------------User Defined LimiteNotation------------------------\n";
print "Enter:";
while($line=<>){
if($line=~ m{exit}i){exit;}
}


PS:在标量上下文中,m//返回真或者假;在表的上下文中,如果使用“g”修饰符来进行全局查找,则m//返回所有匹配值的列表。

例如,创建一个数组@a,它将容纳$_中的所有小写单词;

print"\n-----Use 'g ' to find list match value------\n";
$_="Hereis the text";
@a=m/\b[^A-Z]+\b/g;
print"@a";
print"\n-----END------\n";


对上面子程序解析如下:

\b:匹配单词范围

[^A-Z]:匹配除了大写字母以外的任何字符;

+:确保可以找到多个匹配值;

g修饰符:说明是全局查找,全局查找可以查找所有连续的匹配值。


 s///运算符可以用一个字符串替换另一个字符串。

 例如:用字符串old替换了字符串young

print"\n--------------------------(s///)USED-----------------------------\n";
$text_young="Prettyyoung.";
print"$text_young\n";
$text_young=~s/young/old/;
print"$text_young\n";
print"\n------------------------END (s///)USED---------------------------\n";



PS:m//和s///是从左边开始匹配。

----------------------------------------------------tr///运算符--------------------------------------------------------------

$text="His name is Tom.";
$text=~tr/o/j/;
print $text."\n";
print"\n------------------------END (tr///)USED---------------------------\n";


正则表达式:\b([A-Za-z]+)\b在文本字符串中匹配单词:

print "\n--------------------------(\b([A-Za-z]+)\b)USED-----------------------------\n";
$text="Prettyyoung.";
print"$text_young\n";
$text=~/\b([A-Za-z]+)\b/;
print"$1\n";
print"\n------------------------END (\b([A-Za-z]+)\b)USED---------------------------\n";


例子解析:

表达式(\b([A-Za-z]+)\b)包含分组元字符、\b边界元字符和字符类[A-Za-z](匹配所有的大写和小写字母)和量词+,它指定在已指定的字符类中查找一个或多个字符。

perl记住一个匹配,前面的代码称之为$1,并打印字符串中的第一个单词。

 

在正则表达式中,任何单个字符都与自身匹配,除非它是具有特殊含义的元字符(例如$和^)

 

print"\n--------------------------('$ and ^')USED-----------------------------\n";
while(<>){
if(m/^exit$/i){
{exit;}
}}
print "\n------------------------END ('$and ^') USED---------------------------\n";

 

perl中特殊字符:

 \077-------------8进制字符

 \a-------------报警(铃声)

 \c[-------------控制字符

 \D-------------匹配非数字字符

 \d-------------匹配数字字符

 \E-------------启用模式元字符

 \e-------------转义

 \f-------------换页

 \L-------------小写,直至遇到\E

 \l-------------小写下一个字符

 \n-------------换行

 \Q-------------引用(禁止)模式元字符,直至遇到\E

 \r-------------回车

 \S-------------匹配非空白字符

 \s-------------匹配空白字符

 \t-------------制表位

 \U-------------大写,直至遇到\E

 \u-------------大写下一个字符

 \W-------------匹配非单词字符

 \w-------------匹配一个单词字符(字母数字字符和“_”)

 \xl-------------16进制字符

 

PS:\w仅匹配一个字母数字字符,而不是单词,为了匹配单词,需要这样使用\w+(匹配一个或多个):

print"\n--------------------------(\w+)USED-----------------------------\n";
$text="Prettyyoung.";
print"$text_young\n";
$text=~s/\w+/There/;
print"$text\n";
print"\n------------------------END (\w+)USED---------------------------\n";

匹配任何字符:‘.’。这个字符可以匹配任意字符,但换行符除外(但是如果与m//和s///一起使用s字符修饰符,句点字符和换行匹配)

用*替换字符串中的所有字符,g修饰符可以使替换操作在全局范围内进行。

print"\n--------------------------(.)USED-----------------------------\n";
$text="Prettyyoung.";
print"$text\n";
$text=~s/./*/g;
print"$text\n";
print"\n------------------------END (.)USED---------------------------\n";


诸如句点这样的字符在正则表达式中称为元字符(元字符包括:\|()[{^$*+?.),仅需在它们前面加入反斜线,就可以确保按照字面意义解释,而不是作为元字符解释。

‘^’:匹配行首,让用户知道不应该用句点开始的句子。

print"\n--------------------------(^)USED-----------------------------\n";
$text=".Prettyyoung.";
print"$text\n";
if($text=~m/^\./){
print"Should't start a sentence with a period!";
}
print"\n------------------------END (^)USED---------------------------\n";


从C代码中删除注释,方法是通过使用*量词和.来代表任意数量的类似字符,以匹配定界符/*和*/之间的所有字符。

print"\n--------------------------(* and .)USED-----------------------------\n";
$text="count++;/*Increment count*/";
$text=~s/\/\*.*\*\///g;

或者使用

$text=~s|\/\*.*\*\/||g;
print $text;
print"\n------------------------END (* and .)USED---------------------------\n";


可以使用多个字符组成字符类,而那个类将匹配其中的任意字符。字符类要包含在[字符类]中。也可以使用-字符指定字符范围

print"\n--------------------------([zi fu yuan zu ])USED-----------------------------\n";
$text="count++;/*Increment count*/";
if($text=~/[couIite]/){
print"Yep,we got vowels.\n";
}
print"\n------------------------END ([zi fu yuan zu ])USED---------------------------\n";

如果使用^作为字符类中的第一个字符,则那个字符类将匹配其中没有的任何字符,在下面的例子,仅匹配了既不是字母也不是空白的字符:

print"\n--------------------------([^A-Za-z\s]+)USED-----------------------------\n";
$text="count200 Increment 000 count ";
$text=~s/[^A-Za-z\s]+/521/;
print $text;
print"\n------------------------END ([^A-Za-z\s]+)USED---------------------------\n";


提取$_中的全部小写的单词,并将它们存储在新数组@a中:

print"\n--------------------------(\b[^A-Z]+\b)USED-----------------------------\n";
$_="Hereis the text";
@a=~m/\b[^A-Z]+\b/g;
print @a;
print"\n--------------------------end (\b[^A-Z]+\b) USED-----------------------------\n";



PS:使用\b匹配单词边界

通过将特定字符或者字符序列作为正则表达式中的文字或者字符类,就可以匹配特定字符或者字符序列。

多重匹配模式:可以为模式指定一系列的选项,并用|分开个选项。例如,可以这样检查用户输入是否为"exit","quit","stop"

 

print "\n--------------------------(|)USED-----------------------------\n";
print "Enter exit|quit|stop:";
while(<>){
if(m/exit|quit|stop/){exit;}
}
print "\n--------------------------END(|) USED--------------------------\n";

print "\n--------------------------(|)USED-----------------------------\n";
print "Enter exit|quit|stop:";
while(<>){
if(m/^(exit|quit|stop)$/){exit;}
}
print "\n--------------------------END(|) USED--------------------------\n";