Perl正则表达式

Perl正则表达式

Perl在IC设计中有广泛的应用,而Perl的正则表达式则由其常见,它与Tcl等语言中的正则表达式有一定的相似之处,因此如果学习过相关正则表达式的话这个不会很难。

参考百度文库:https://wenku.baidu.com/view/baa401f5dd88d0d233d46ab5.html

正则表达式的三种形式

    首先我们应该知道Perl程序中,正则表达式有三种存在形式,他们分别是:

        匹配:m/<regexp>/(还可以简写为/<regexp>/,略去m

        替换:s/<pattern>/<replacement>/

        转化:tr/<pattern>/<replacemnt>/

        这三种形式一般都和=~!~搭配使用,并在左侧有待处理的标量变量,如果没有该变量和=~ !~操作符,则默认为处理$_变量中的内容.

        (其中"=~"表示相匹配,在整条语句中读作does,"!~"表示不匹配,在整条语句中读作doesn't)

    举例如下:

      $str="I lovePerl";

        $str=~m/Perl/;#表示如果在$str中发现"Perl"字符串,则返回"1"否则返回"0".

        $str=~s/Perl/BASH/;#表示将变量$str中的"Perl"字符串替换为"BASH",如果发生此替换则返回"1",否则返回"0".

        $str!~tr/A-Z/a-z/;#表示将变量$str中的所有大写字母转化为小写字母,如果转化发生了则返回"0",否则返回"1".

      另外还有:

       foreach(@array){s/a/b/;}#此处每次循环将从@array数组中取出一个元素存放在$_变量中,并对$_进行替换处理.

       while(<FILE>){print if(m/error/);}#这一句稍微复杂一些,他将打印FILE文件中所有包含error字符串的行.

    Perl的正则表达式中如果出现(),则发生匹配或替换后()内的模式被Perl解释器自动依次赋给系统$1,$2......

      请看下面的例子:

          $string="Ilove perl";

           $string=~s/(love)/<$1>/; #此时$1="love",并且该替换的结果是将$string变为"I<love>perl"

 

          $string="ilove perl";

           $string=~s/(i)(.*)(perl)/<$3>$2<$1>/;#这里$1="i",$2="love",$3="perl",并且替换后$string变为"<perl>love<i>"

 

1、模式匹配

1.1、匹配操作符

匹配操作符 m// 用于匹配一个字符串语句或者一个正则表达式,例如,要匹配标量$bar 中的"run",代码如下所示:

实例

#!/usr/bin/perl

 

$bar = "I am runoob site. welcome to runoob site.";

if ($bar =~ /run/){

   print "第一次匹配\n";

}else{

   print "第一次不匹配\n";

}

 

$bar = "run";

if ($bar =~ /run/){

   print "第二次匹配\n";

}else{

   print "第二次不匹配\n";

}

执行以上程序,输出结果为:

第一次匹配

第二次匹配

 

1.2、模式匹配修饰符

模式匹配有一些常用的修饰符,如下表所示:

修饰符

描述

i

忽略模式中的大小写

m

多行模式

o

仅赋值一次

s

单行模式,"."匹配"\n"(默认不匹配)

x

忽略模式中的空白

g

全局匹配

cg

全局匹配失败后,允许再次查找匹配串

 

1.3、正则表达式变量

perl处理完后会给匹配到的值存在三个特殊变量名:

  • $`: 匹配部分的前一部分字符串

  • $&: 匹配的字符串

  • $': 还没有匹配的剩余字符串

如果将这三个变量放在一起,你将得到原始字符串。

实例如下:

实例

#!/usr/bin/perl

 

$string = "welcome to runoob site.";

$string =~ m/run/;

print "匹配前的字符串:$`\n";

print "匹配的字符串:$&\n";

print "匹配后的字符串:$'\n";

执行以上程序输出结果为:

匹配前的字符串:welcome to

匹配的字符串: run

匹配后的字符串: oobsite.

 

2、模式替换

2.1、替换操作符

替换操作符 s/// 是匹配操作符的扩展,使用新的字符串替换指定的字符串。基本格式如下:

s/PATTERN/REPLACEMENT/;

PATTERN 为匹配模式,REPLACEMENT为替换的字符串。

例如我们将以下字符串的"google" 替换为"runoob":

实例

#!/usr/bin/perl

 

$string = "welcome to google site.";

$string =~ s/google/runoob/;

 

print "$string\n";

执行以上程序输出结果为:

welcome to runoob site.

 

2.2、替换操作修饰符

替换操作修饰符如下表所示:

修饰符

描述

i

如果在修饰符中加上"i",则正则将会取消大小写敏感性,即"a""A" 是一样的。

m

默认的正则开始"^"和结束"$"只是对于正则字符串如果在修饰符中加上"m",那么开始和结束将会指字符串的每一行:每一行的开头就是"^",结尾就是"$"

o

表达式只执行一次。

s

如果在修饰符中加入"s",那么默认的"."代表除了换行符以外的任何字符将会变成任意字符,也就是包括换行符!

x

如果加上该修饰符,表达式中的空白字符将会被忽略,除非它已经被转义。

g

替换所有匹配的字符串。

e

替换字符串作为表达式

 

    例如:

       s/<pattern>/<replacement>/g 表示把待处理字符串中所有符合<pattern>的模式全部替换为<replacement>字符串.

       s/<pattern>/<replacement>/e表示将把<replacemnet>部分当作一个运算符,这个参数用的不多.

        比如下面的例子:

         $string="i:love:perl";

            $string=~s/:/*/;#此时$string="i*love:perl";

           $string=~s/:/*/g;#此时$string="i*love*perl";

            $string=~tr/*//;#此时$string="iloveperl";

         $string="www22cgi44";

           $string=~s/(\d+)/$1*2/e;#(/d+)代表$string中的一个或多个数字字符,将这些数字字符执行*2的操作,因此最后$string变成了"www44cgi88".

 

3、模式转化

这是另一种替换方式,语法如:tr/string1/string2/。同样,string2为替换部分,但其效果是把string1中的第一个字符替换为string2中的第一个字符,把string1中的第二个字符替换为string2中的第二个字符,依此类推。如:

$string = "abcdefghicba";

$string =~ tr/abc/def/; # now string = "defdefghifed"

string1string2长时,其多余字符替换为string2的最后一个字符;当string1中同一个字符出现多次时,将使用第一个替换字符。

例如:

#!/usr/bin/perl

 

$str = "abbcddeff";

$str =~ tr/abcc/ABCD/;

 

print "$str\n";

将输出:

ABBCddeff

 

3.1、转化操作符

以下是转化操作符相关的修饰符:

修饰符

描述

c

转化所有未指定字符

d

删除所有指定字符

s

把多个相同的输出字符缩成一个

以下实例将变量 $string中的所有小写字母转化为大写字母:

#!/usr/bin/perl

 

$string = 'welcome to runoob site.';

$string =~ tr/a-z/A-Z/;

 

print "$string\n";

执行以上程序输出结果为:

WELCOME TO RUNOOB SITE.

以下实例使用 /s 将变量 $string 重复的字符删除:

实例

#!/usr/bin/perl

 

$string = 'runoob';

$string =~ tr/a-z/a-z/s;

 

print "$string\n";

执行以上程序输出结果为:

runob

更多实例:

$string =~ tr/\d/ /c;     # 把所有非数字字符替换为空格

$string =~ tr/\t //d;     # 删除tab和空格

$string =~ tr/0-9/ /cs    # 把数字间的其它字符替换为一个空格。

 

正则表达式中的常用模式.

    /pattern/                    结果

    .                               匹配除换行符以外的所有字符

    x?                             匹配0次或一次x字符串

    x*                             匹配0次或多次x字符串,但匹配可能的最少次数

    x+                             匹配1次或多次x字符串,但匹配可能的最少次数

    .*                              匹配0次或多次的任何字符

    .+                             匹配1次或多次的任何字符

    x{m}            匹配刚好是mx的指定字符串

    x{m,n}                     匹配大于等于m个,小于等于nx的指定字符串

    x{m,}                       匹配大于等于mx的指定字符串

    []                              匹配符合[]内的字符

    [^]                            匹配不符合[]内的字符

    [0-9]                         匹配所有数字字符

    [a-z]                          匹配所有小写字母字符

    [^0-9]                        匹配所有非数字字符

    [^a-z]            匹配所有非小写字母字符

    ^                               匹配字符开头的字符

    $                               匹配字符结尾的字符

    \d                              匹配一个数字的字符,[0-9]语法一样

    \d+                            匹配多个数字字符串,[0-9]+语法一样

    \D                             非数字,其他同\d

    \D+                           非数字,其他同\d+

    \w                             英文字母或数字的字符串,和[a-zA-Z0-9]语法一样

    \w+                           [a-zA-Z0-9]+语法一样

    \W                            非英文字母或数字的字符串,[^a-zA-Z0-9]语法一样

    \W+                          [^a-zA-Z0-9]+语法一样

    \s                              空格,和[\n\t\r\f]语法一样

    \s+                            [\n\t\r\f]+一样

    \S                             非空格,和[^\n\t\r\f]语法一样

    \S+                           [^\n\t\r\f]+语法一样

    \b                              匹配以英文字母,数字为边界的字符串

    \B                             匹配不以英文字母,数值为边界的字符串

    a|b|c                          匹配符合a字符或是b字符或是c字符的字符串

    abc                           匹配含有abc的字符串

    (pattern)                   ()这个符号会记住所找寻到的字符串,是一个很实用的语法。第一个()内所找到的字符串变成$1这个变量或是\1变量,第二个()内所找到的字符串变成$2这个变量或是\2变量,以此类推下去。

    /pattern/i                   i这个参数表示忽略英文大小写,也就是在匹配字符串的时候,

  • 发表于 2018-09-14 13:56
  • 阅读 ( 3022 )
  • 分类:perl

0 条评论

请先 登录 后评论
安生水
安生水

348 篇文章

作家榜 »

  1. omicsgene 700 文章
  2. 安生水 348 文章
  3. Daitoue 167 文章
  4. 生物女学霸 120 文章
  5. xun 82 文章
  6. 红橙子 78 文章
  7. rzx 75 文章
  8. CORNERSTONE 72 文章