文档章节

perl正则表达式

henni_719
 henni_719
发布于 2017/04/22 17:13
字数 1572
阅读 1
收藏 0


  默认情况下,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";

 

 

 

© 著作权归作者所有

henni_719
粉丝 2
博文 466
码字总数 343938
作品 0
信阳
QA/测试工程师
私信 提问

暂无文章

Jenkins系列_插件安装及报错处理

进入Jenkins之后我们可以进行插件的安装,插件管理位于以下模块: 发现上面报了一堆错误,是因为插件的依赖没有安装好,那么这一节,就先把这些错误解决掉吧。解决完成后,也就基本会使用插件...

shzwork
今天
2
0
mysql mysql的所有查询语句和聚合函数(整理一下,忘记了可以随时看看)

查询所有字段 select * from 表名; 查询自定字段 select 字段名 from 表名; 查询指定数据 select * from 表名 where 条件; 带关键字IN的查询 select * from 表名 where 条件 [not] in(元素...

edison_kwok
昨天
9
0
多线程同时加载缓存实现

import com.google.common.cache.Cache;import com.google.common.cache.CacheBuilder;import java.util.concurrent.ExecutionException;import java.util.concurrent.ExecutorServi......

暗中观察
昨天
3
0
利用VisualVM 内存查看

准备工作,建几个测试类。等下就是要查看这几个类里面的属性 package visualvm;public class MultiObject { private String str; private int i; MultiObject(String str...

冷基
昨天
2
0
组装一台工作游戏两用机

一、配置清单如下: 分类 项目 价格(元) 主板 华硕(ASUS)TUF Z370-PLUS GAMING II 电竞特工 Z370二代 支持9代CPU 1049 CPU 英特尔(Intel) i7 8700K 酷睿六核 盒装CPU处理器 2640 风扇 九...

mbzhong
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部