学习笔记 如何实现Perl正则表达式匹配

开发 架构
Perl正则表达式有三种形式,分别是匹配、替换和转换。这里向大家简单介绍一下其中之一Perl正则表达式匹配的用法,希望本文介绍对你有所帮助。

本文和大家重点讨论一下Perl正则表达式匹配的用法,在学习Perl语言的过程中Perl正则表达式有很多值得学习的地方,这里和大家分享一下Perl正则表达式匹配方面的知识。

Perl正则表达式详解

Perl正则表达式有三种形式:匹配、替换和转换。接下来对每一个表达式给出详尽解释。

Perl正则表达式匹配:m/<regexp>/这种形式表明在//内部的正则表达将用于匹配=~或!~左边的标量。为了语法上的简化用/<regexp>/,略去m。

Perl正则表达式替换:s/<regexp>/<substituteText>/这种形式表明Perl正则表达式<regexp>将被文本<substituteText>替换,为了语法的简化用/<regexp>/<substituteText>略去s。

Perl正则表达式转换:tr/<charClass>/<substituteClass>/这种形式包含一系列的字符—/<charClass>—同时把它们替换为<substituteClass>。

注意转换<tr>并不真正是一个Perl正则表达式,但是对于用Perl正则表达式难于处理的数据常使用它来进行操纵。因此,tr/[0-9]/9876543210.组成1223456789,987654321等字符串。

◆通过使用=~(用英语讲:does,与“进行匹配”同)和!~(英语:doesn't,与“不匹配”同)把这些表达式捆绑到标量上。作为这种类型的例子,下面我们给出六个示例Perl正则表达式及相应的定义:

  1. $scalarName=~s/a/b;#substitutethecharacteraforb,andreturntrueifthiscanhappern  
  2.  
  3. $scalarName=~m/a;#doesthescalar$scalarNamehaveanainit?  
  4.  
  5. $scalarName=~tr/A-Z/a-z/;#translateallcapitalletterwithlowercaseones,andreturntureifthishappens  
  6.  
  7. $scalarName!~s/a/b/;#substitutethecharacteraforb,andreturnfalseifthisindeedhappens.  
  8.  
  9. $scalarName!~m/a/;#doesthescalar$scalarNamematchthecharactera?Returnfalseifitdoes.  
  10.  
  11. $scalarName!~tr/0-9/a-j/;#translatethedigitsforthelettersathruj,andreturnfalseifthishappens  

.如果我们输入像hornedtoad=~m/toad/这样的代码,则出现图9-1所示情况:

另外,如果读者正在对特定变量$_进行匹配(读者可能在while循环,map或grep中使用),则可以不用!~和=~。因而,以下所有代码都会合法:

  1. my@elemente=('al','a2','a3','a4','a5');  
  2.  
  3. foreach(@elements){s/a/b/;}  
  4.  

 

程序使@elements等于b1,b2.b3,b4,b5。另外:

while(<$FD>){printif(m/ERBOR/);}

打印所有包含error字符串的行:

if(grep(/pattern/,@lines)){print"thevariable\@lineshaspatterninit!\n";}

打印所有包含模式pattern内容的行,这直接引入下一原则。


◆Perl正则表达式匹配。

Perl正则表达式尽在标量上匹配,注意这里标量的重要性,如果读者试一试如下代码:

  1. @arrayName=('variablel','variable2');  
  2.  
  3. @arrayName=~m/variable/;#looksfor'variable'inthearray?No!usegrepinstead  
  4.  

 那么@arrayName匹配不成功!@arrayName被Perl解释为2,于是这意味着读者在输入:

'2'=~m/variable/;

至少讲这不能给出预想的结果。如果读者想这样做,输人为:

grep(m/variable/,@arrayName);

该函数通过@arrayName中的每一个元素进行循环,返回(在标量环境中)匹配的次数,同时在数组环境中返回匹配元素的实际列表。

 
◆对于给定的模式串,Perl正则表达式只匹配最早出现的匹配项。匹配时缺省一次只匹配或替换一次。

这个原则使用称为“回溯”的过程指出如何匹配一个给定的字符串;如果发现了一个局部匹配进而找到使该匹配无效的东西,Perl正则表达式在字符串中“回溯”最小的可能数量,这个数量的字符要保证不丢失任何匹配。

对于理解Perl正则表达式正在做什么,这个原则是最有帮助的一个,同时不需要与Perl一样的形式来理解它正在做什么。假定有如下模式:'Sillypeopledosillythingsifinsillymoods'

同时想匹配如下模式:'sillymoods'

那么Perl正则表达式引擎匹配silly,接着遇到people的P,至此,Perl正则表达式引擎知道***个silly不匹配,于是Perl正则表达式引擎移到P且继续寻求匹配。它接着遇到第二个silly,于是来匹配moods。然而得到的是字母t(在thing中),于是移到things中的t处,继续进行Perl正则表达式匹配。当引擎遇到第三个silly并且尽力匹配moods时,匹配成功,匹配***完成。当我们遇到通配符时回溯将变得更加重要。如果在同一Perl正则表达式中有几个通配符,且所有的通配符交织在一起,那么这里就有病态情形出现,在这种情形下,回溯变得非常昂贵。看如下表达式:$line=m/expression.*matching.*could.*be.*very.*expensive.*/

◆*代表一个通配符,它意味着“匹配任意字符(换行符除外)零次或多次”。这个过程有可能花很长时间;如果在未匹配过的字符串末尾有可能匹配,那么引擎将发狂地回溯。为得到这方面的更多信息,请留意关于通配符方面的原则。

如果读者发现类似于上面的情形,那么通配符需将Perl正则表达式分解成小功部分。换句话讲,简化自己的Perl正则表达式。

【编辑推荐】

  1. 实例解说Perl 字符匹配用法
  2. Perl模式匹配经验总结
  3. Perl引用中直接引用用法解析
  4. Perl模式匹配选项详解
  5. 技术分享 解析Perl模块创建和导入方法
责任编辑:佚名 来源: csdn.net
相关推荐

2010-07-13 16:56:30

Perl正则表达式

2010-07-13 17:03:53

Perl正则表达式

2010-07-14 09:01:18

Perl正则表达式

2010-07-19 10:40:16

Perl正则表达式

2010-07-14 09:37:46

Perl正则表达式

2009-08-11 13:00:41

C#正则表达式

2009-08-13 15:24:27

C#正则表达式

2009-09-16 12:41:42

Perl正则表达式

2009-09-16 16:22:04

正则表达式匹配

2010-07-22 09:12:05

Perl正则表达式

2010-07-14 09:47:04

Perl正则表达式

2010-03-15 16:21:28

Python正则表达式

2009-09-16 13:24:30

PHP正则表达式匹配

2016-11-10 16:21:22

Java 正则表达式

2015-04-16 11:16:05

PHPPOSIX正则表达式

2009-09-16 13:53:17

PHP正则表达式匹配

2009-09-16 17:02:15

正则表达式匹配字符串

2009-09-16 17:38:49

正则表达式匹配任意字符

2009-09-16 18:08:14

正则表达式匹配单词

2010-07-14 10:06:55

Perl正则表达式
点赞
收藏

51CTO技术栈公众号