设为首页 收藏本站
查看: 1405|回复: 0

[经验分享] PERL学习笔记---正则表达式的应用

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-12-27 15:12:40 | 显示全部楼层 |阅读模式
  使用m//匹配
  //这是m//(模式匹配)的一种简写。同qw//操作一样,可以使用任何
成对的分隔符。因此,可以使用m(fred), m<fred>, m{fred}, m[fred],或者m,fred,, m!fred!, m^fred^,其它非成对的分隔符也
可以
  不区分大小写:/i
  if(/yes/i) {#大小写无关
  print “In that case, I recommend that you go bowling.\n”;
}

  
  匹配任何字符:/s
  默认情况下,点(.)不匹配换行符,这对于“单行中查找”的问题能很好解决。如果你的字符串中有换行符,并希望点(.)能匹
配它们,那可以使用/s 这个修饰符。它将模式中点(.)◆的行为变成同字符类[\d\D]的行为类似:可以匹配任何字符,包括换
行符。从下例中可见其区别:
◆如果你想改变其中的一部分,但不是全部,那可以将此部分用[\d\D]代替
  $_ = “I saw Barney\ndown at the bowing alley\nwith Fred\nlast night.\n”;
if(/Barney.*Fred/s){
print “That string mentions Fred after Barney!\n”;
}
如果不使用/s,那么上述模式将不能被匹配上,因为这两个字符不在同一行中。
  
  符号^(脱字字符◆)表示在字符串的开头进行匹配,而符号$则表示在结尾◆。因此,模式/^fred/只匹配字符串的开头部分;
它不会匹配上manfred man。而/rock$/只在结尾处匹配;其不会匹配上knute rockne。

  锚定不仅仅针对字符串的两头。词界锚定,\b,是针对单词使用的。如/\bfred\b/可以匹配上单词fred,但不能匹配frederick,
alfred, man fred mann。这同字处理软件中的“全字匹配(match whole words only)”是类似的。
◆某些正则表达式实现中开头的锚定和结尾锚定不同,但Perl 中均使用\b。
这些单词(words)不是你或者我通常认为的那样;它们是\w 类型,由通常的字母,数字,下划线组成。\b 将从开头或结尾
匹配这些\w 类型的字符。
  非词界锚定为\B。它将在任何非\b 匹配的点上进行匹配。因此,模式/\bsearch\B/将匹配searches, searching, searched, 但不能
匹配search,或者researching。
  
  
  绑定操作符(binding operator:=~)
  ),$likes_perl 将根据用户的输入而得到一个boolean 值。它有一些quick-and-ditry,因为输入
行很快就被丢弃了。这段代码将读入一行,由右边的模式进行匹配,然后丢弃此输入◆。它没有使用$_。
◆输入的字符不会自动存储在$_中,除非行输入操作(<STDIN>)单独出现在while 循环的条件判断部分。
print “Do you like Perl? ”;
my $likes_perl = (<STDIN> =~ /\byes\b/i);
… #Times passes…
if($likes_perl){
print “You said earlier that you like Perl, So… \n”;

}
由于绑定操作有非常高的优先级,因此,模式测试部分的括号不是必需的,下面的代码和上面代码的含义是一样的。它将
测试部分的结果(而非行输入)返回给变量$likes_perl:
my $likes_perl = <STDIN> =~ /\byes\b/i;
  其含义是:“这个模式默认将对
$_进行匹配,但此时将对左边的字符串进行匹配”。如果没有绑定操作符,则此表达式将对$_匹配。
  
  
  匹配变量
我们曾经在模式中使用过括号,使用括号是由于它可以将模式的某一部分组合起来。同时括号也会引起正则表达式分配新
的内存块。这些内存含有括号中的模式所匹配的字符串。如果有不止一对括号,那就不止一块内存块。每一个内存块内有
一段字符串,而非模式的一部分。
由于这些变量含有字符串,那它们是标量变量;在Perl 中,它们具有像$1, $2 这样的名字。变量个数同模式中括号对数的个
数是相同的。如$4 是指第四对括号所匹配的字符串◆。
◆这和后引用(backreference)\4 在模式匹配中引用字符的字符串相同。但它们不仅是同一事物的两个不同名字;\4 是模式正在匹配是引
用的;而$4 是模式匹配完成后再引用的。想了解更多的关于backreferences 的信息,可参见perlre 的帮助手册。
这些匹配变量(match variables)是组成正则表达式强大功能的重要部分,它允许取出相应的字符串:
$_ = “Hello there, neighbor”;
if(/\s(\w+),/){ #空格和逗号之间的词
print “the word was $1\n”; #the word was there
}
也可以一次使用多个:
$_ = “Hello there, neighbor”;
if(/(\S+) (\S+), (\S+)/){
print “words were $1 $2 $3”;
}
  其输出为words were Hello there neighbor。注意输出中没有逗号。因为第二块内存中没有逗号。使用这种技术,可以选择
我们感兴趣的部分。
  匹配变量可能是空的◆,如果其没有被匹配上。也就是说,匹配变量的值可能为空串:
◆这和undefined 是不同的。如果模式中只有3 个或者更少的括号,那$4 为undef。
my $dino = "I fear that I'll be extinct after 1000 years.";
if ($dino =~ /(\d*) years/) {
print "That said '$1' years.\n"; # 1000
}
my $dino = "I fear that I'll be extinct after a few millions years.";
if ($dino =~ /(\d*) years/) {
print "That said '$1' years.\n"; # 空串
}

  自动匹配变量
  if(“Hello there, neigbor”=~ /\S(\w+),/){
print “That actually matched ‘$&’.\n”;
}
匹配的部分是“there,”(空格,单词,和一个逗号)。变量$1 中的值为there,而$&为整个被匹配的部分。
匹配部分的前一部分存放在$`之中,后一部分被存到$'。另一种说法是,$`中含有正则表达式引擎在匹配成功前所找到的变
量,而$'为此模式还没有匹配的剩余部分。如果将这三个变量放在一起,你将得到原始字符串:
if (“Hello there, neighbor”=~ /\S(\w+),/){
pirnt “That was ($`)($&)($’)”;
}
  
  输出的消息为(Hello)( there,)( neighbor),为这三个自动匹配变量的值。三个变量的值可能是空的,和之前数字匹配变量的例
子一样。它们和数字匹配变量有相同的作用域。通常,在下次成功匹配前其值不变。
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-157040-1-1.html 上篇帖子: Larry wall 下篇帖子: Perl 学习笔记 1
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表