Perl 中正则表达式

时间:2022-06-23 09:09:25
正则表达式的三种形式
Perl程序中,正则表达式有三种存在形式,如下:
匹配:m/<regexp>/; (还可以简写为 /<regexp>/; 省略 m)
替换:s/<pattern>/<replacement>/;
转换: tr/<pattern>/<replacement>/;
这三种形式一般都和 =~ 或 !~ 搭配使用(其中 "=~" 表示相匹配,在整条语句中读作 does,"!~"表示不匹配,在整条语句中读作doesn't),并在左侧有待处理的标量变量.如果没有该变量和 =~ !~操作符,则默认处理$_变量中的内容。举例如下:
$str = "I love Perl";
$str =~ m/Perl/; ##表示如果在 $str 中发现 "Perl" 字符串,则返回 "1",否则返回"0"。
$str =~ s/Perl/BASH/; ##表示将变量 $str 中的 "Perl" 字符串替换成字符串"BASH",如果发生此替换则返回"1",否则返回"0";
$str =~ tr/A-Z/a-z/;  ##表示将变量 $str 中字符串大写字母转换成小写字母。如果转换发生则返回"1",否则返回"0";

foreach (@array){s/a/b/}  ##每次循环将从 @array 数组中取出一个元素存放在 $_变量中,并对 $_ 进行替换处理。
while (<FILE>) {print if (m/error/)} ##此处将打印 FILE 文件中所有包含 error 字符串的行。
Perl 的正则表达式中如果出现() ,则发生匹配或替换后 () 内的模式被Perl 解释器自动一次赋给系统 $1 ,$2... 。如下:
$string = "I love Perl";
$string =~ s/(love)/<$1>/; ##此时 $1 是字符串"love" ,并且该替换结果是将 $string 变为 "I <love> Perl";
$string =  "I love Perl";
$string =~ s/(i)(.*)(Perl)/<$3> $2 <$1>/; ## 替换后 $string 变为 “<Perl> love <I>”;
替换操作 s/<pattern>/<replacement>/ 还可以在末尾加上  e 或 g 参数,它们的含义分别为:
s/<pattern>/<replacement>/g  ##表示把待处理字符串中所有符合<pattern> 的模式全部替换为 <replacement>字符串,而不是只替换第一个出现的模式。
s/<pattern>/<replacement>/e  ##表示把<replacement>部分当作一个算术表达式。
如下面的例子:
$string = "i:love:perl";
$string =~ s/:/*/;  ## 结果 $string = "i*love:perl";

$string = "i:love:perl";
$string =~ s/:/*/g;  ## 结果 $string = "i*love*perl";
$string =~ tr/*/ /;  ## 结果 $string = "i love perl";
$string = "www22cgi44";
$string =~ s/(\d+)/$1*2/eg ; ##结果 $string = "www44cgi88"; 

                /pattern/                                                                  结果                                                                          
              .   匹配除换行符以为的所有字符
             x?   匹配0次或 1次 x字符串
            x*   匹配0次或多次 x 字符串
           x+  匹配1次或多次x字符串
           .*   匹配0次或多次 的任何字符 
          .+  匹配1次或多次的任何字符
         {m}  匹配刚好是 m 个 的指定字符串
         {m,n}  匹配m个以上n个以下的指定字符串
         {m,}  匹配m个以上的指定字符串
        [ ]  匹配符合 [ ] 内的字符
       [^ ]  匹配不符合 [ ] 内的字符
       [0-9]  匹配所有数字字符
       [a-z]  匹配所有小写字母字符
      [^0-9]  匹配所有非数字字符
     [^a-z]  匹配所有非小写字母字符
     ^  匹配字符开头的字符
    $  匹配字符结尾的字符
    \d   匹配一个数字字符,和[0-9]一样
   \d+   匹配多个数字字符串,和[0-9]+ 一样
   \D  匹配非数字字符,和[^0-9]一样
   \D+   匹配多个非数字字符串,和[^0-9]+ 一样
   \w  匹配一个 英文字母、下划线或数字的字符串 ,和[a-zA-Z0-9_]一样
   \w+ 

 匹配多个英文字母、下划线或数字的字符串,和[a-zA-Z0-9_]+一样 

   \W  和 [^a-zA-Z0-9] 一样
   \W+  和 [^a-zA-Z0-9]+ 一样
   \s  匹配空白,和 [\t\n\r\f] 一样
   \s+  和 [\t\n\r\f]+ 一样
   \S  匹配非空白,和[^\t\n\r\f] 一样
   \S+   和 [^\t\n\r\f] 一样
   \b 匹配单词边界,以英文字母,数字为边界的字符串
  \B   和 \b 相反
  a|b|c  匹配符合a字符 或 b字符 或  c字符 的字符串
 abc  匹配含有 abc 的字符串
 (pattern)  ()这个符合会记住所找到的字符串,第一个()内所找到的字符串变成 $1 这个变量 或是 \1 变量,第二个()内所找到的字符串变成$2 这个变量或是 \2变量,以此类推.
  \  如果需要在 pattern 模式中匹配一个特殊字符,需要使用转义符号( \ 符号)

/pattern/i                               i这个参数表示忽略英文大小写


示例:

范例                                      说明                                                                                                                                             
/perl/ 找到含有 perl 的字符串
/^perl/  找到开头是perl的字符串
/perl$/  找到结尾是 perl 的字符串
/c|g|i/ 找到含有 c或g或i 的字符串
/cg{2,4}i/ 找到c后面跟着2到4个g后面再跟着i 的字符串
/cg{2,}i/ 找到c后面跟着2个以上的g 后面再跟者i的字符串
/cg*i/ 找到c后面跟着0到多个g后面再跟着i的字符串
/cg{2}i/ 找到c后面跟着2个g后面再跟着i的字符串
/cg+i/ 找到c后面跟着1个到多个g后面再跟着i的字符串
/cg?i/ 找到c后面跟着0个或一个g后面再跟着i 的字符串
/c.i/ 找到c后面跟着一个任意的字符后面再跟着i 的字符串
/c..i/  找到c后面哥你在2个任意的字符后面再跟着i的字符串
/[cgi]/ 找到符合这三个字符中任意一个的字符串
/[^cgi]/ 找到没有这三个字符中任意一个的字符串
/\d/ 找到符合数字的字符串
/\D/ 找到不是数字的字符串
/\*/ 找到符合 “*” 这个字符的字符串
/abc/i  找到符合 abc 的字符串而且不考了这些字符串打的大小写

正则表达式八大原则:

  • 正则表达式有三种不同形式(匹配 、替换、转换)。
  • 正则表达式仅对标量进行匹配。
  • 正则表达式匹配一个给定模式的最早可能匹配。缺省时,仅匹配或替换正则表达式一次。
  • 正则表达式能够处理双引号所能处理的任意和全部字符。
  • 正则表达式在求值过程中产生两种情况:结果状态(是否匹配成功)和反向引用( \1 或 $1这些)。
  • 正则表达式的核心能力在于通配符和多重匹配运算符以及它们如何操作。
  • 如果欲匹配不止一个字符集合,使用 “ | ” 来增加灵活性。
  • Perl用( ?..  )语法 给正则表达式提供扩展功能。