Perl正则表达式

一、正则表达式的定义

  就是用某种模式去匹配一类字符串的一个公式。当给定一个正则表达式和字符串,我们可以用力判断给定的字符串是否符合正则表达式的过滤逻辑,也就是我们常说的“匹配”。

我们可以通过正则表达式,从字符串中获取我们想要的特定部分。

二、正则表达式的应用

1、简单模式

如果模式匹配的对象是$_,把模式写在斜线(/)中。若能匹配上,则返回值为1,否则返回值为0。例如:

#!/usr/bin/perl
use strict;
$_  = "Hello World,you are so beautiful";
if(/you/) {print "it match\n";}

Perl正则表达式

注意:若匹配项中本身含有斜线,则需要使用反斜线。

#!/usr/bin/perl
use strict;
$_  = "the txt is in D:/Perl/Test";
if(/D:\/Perl\/Test/) {print "it match\n";}

Perl正则表达式

Unicode属性

即使用字符的属性来进行匹配。使用\p{属性名}表示该属性的模式。也可以使用\P{属性}表示匹配不包含属性的部分,与不匹配不一样。

  #!/usr/bin/perl
  use strict;
  print "-----------case1------------------------\n";
  $_  = "Hello,world!Welcome to the Perl field\n";
  if(/world!/) {print "there is world! expression\n";}
  if(/\p{Space}/) {print "there are space in the string\n";}
  if(/\p{Digit}/) {print "there are digits in the string\n";}
  print "\n----------------case2------------------\n";
  $_ = "In_the_C:/Perl/Test/example1";
  print "string is:\n$_\n";
  if(/C:\/Perl\/Test/) {print "there is C:/Perl/Test expression\n";}
  if(/\P{Space}/) {print "there are string not Space found\n";}
  if(/\P{Digit}/) {print "there are string not digit found\n";}

Perl正则表达式

模式分组

利用小括号来进行字符串的分组。

括号、反斜线、数字编号可以组成捕获组的模式,括号内的内容作为元字符,用反斜线后面加数字表示再次匹配。

/(world)\3/表示匹配:worldworldworldworld

择一匹配,使用竖线来表示匹配时候的“或”

/hello|world/    能匹配任何包括hello或者world的字符串
  #!/usr/bin/perl
  use strict;
  $_ = "Hello my World,it's a string\n";
  print "string is:\n$_";
 
  if(/Hello (|my) World/) {print "match\n";}
 
  $_ = "Hello World,it's a string\n";
  print "string is:\n$_";
  if(/Hello(|my) World/) {print"match\n";}
  

Perl正则表达式

正则表达式中的元字符

元字符是一种特殊字符,起通配作用,在它们前面加上反斜杠(\),这些元字符就会失去其特殊含义。

单字符与数字
元字符 所代表含义
. 匹配除换行符以外的任意字符
[a-z0-9] 匹配集合中任意单个字符
[^a-z0-9] 匹配不在集合中的任意单个字符
\d 匹配单个数字
\D 匹配非数字字符,等效于[^0-9]
\w 匹配数字型(字)字符
\W 匹配非数字型(非字)字符

 

 

 

 

 

 

 

 

 

空白字符
元字符 所代表的意义
\s 匹配空白字符,如空格,制表符和换行符
\S 匹配非空白字符
\n 匹配换行符
\r 匹配回车符
\t 匹配制表符
\f 匹配进制符
\b 匹配退格符
\0 匹配空值字符

 

 

 

 

 

 

 

 

 

 

锚定字符
元字符 所代表的含义
\b 匹配字边界(不在[]中时)
\B 匹配非字边界
^ 匹配行首
$ 匹配行尾
\A 匹配字符串开头
\z 匹配字符串或行的末尾
\Z 匹配字符串末尾
\G 匹配前一次m//g

 

 

 

 

 

 

 

 

 

 

重复字符
元字符 所代表的含义
x? 匹配0或1个x
x* 匹配0或多个x
x+ 匹配1或多个x
(xyz)+ 匹配1或多个模式xyz
x(m,n) 匹配m到n个x组成的值

 

 

 

 

 

 

 

替换字符
元字符 所代表的含义
(was|were|will) 匹配was/were/will之一

 

 

 

其他字符
元字符 所代表的含义
\12 匹配8进制数,直到\377
\x811 匹配16进制数值
\cX 匹配控制字符,譬如\cC
\e 匹配ASCII
\x{NUMBER} 匹配以十六进制形式给出的Unicode

 

 

 

 

 

 

 

元字符优先级

当模式中含有多种元字符时,根据优先级顺序来判断匹配量

元字符属性 示例
圆括号(分组或者捕获) (...),(?....),(ABC)
量词 a*,a+,a?,a{n,m}
错位和序列 abc,^,$,\A,\b,\z\Z
择一竖线 |
原子 a,[abc],\d,\1

 

 

 

 

 

 

 

正则表达式的形式

模式匹配:得到“是否匹配”的结果,无其他操作。

形式:m/<regexp>/或/<regexp>/或m?<regexp>?

同匹配操作符一起,用来判断是否匹配后面的字符串,匹配的表达式中,括号部分的匹配项用$标号表示。匹配上,返回值为1,否则为0。

#!/usr/bin/perl
use strict;
my $string = "This string contains the number 25.11";
my $test = $string =~/-?(\d+)\.?(\d+)/;
print $string."\n";
print $test."\n";
my $integerpart = $1;   #$1表示模式匹配中第一个括号
my $decimalpart = $2;   #$2表示模式匹配中第二个括号
print $integerpart."\n";
print $decimalpart."\n";
print $0."\n";    #$0表示程序本身

Perl正则表达式

模式匹配的选项

选项

描述
g 忽略所有可能的模式
i 忽略大小写
m 将串视为多行
s 将串视为单行
x 忽略模式中的空白

 

 

 

 

 

 

 

 #!/usr/bin/perl
 use strict;
 my @matches = "balata" =~/.a/g;
 foreach my $item(@matches)
 {
     print $item."\n";
 } 
 my @matches2 = "balata" =~/.a/;
 foreach my $item(@matches2)
 {
   print $item."\n";
 }

Perl正则表达式

my @matches = ("Dea","deb","dEC","DED");
foreach my $item (@matches)
{
       if($item =~/de/i)
      {
         print $item."\n";
      }
}
print "-----------------------------\n";

foreach my $item (@matches)
{
      if($item =~/de/)
      {
        print $item."\n";
      }
}

Perl正则表达式

my $var = "We love China\nThat's right";
my $var1 = "We love China and That's right";
if ($var =~ /China.*right/)
{
    print "var matches\n";
} 
if ($var1 =~ /China.*right/)
{
     print "var1 matches\n";
} 
print "---------------------------\n"; 
if ($var =~ /China.*right/s)
{
    print "var matches\n";
}
if ($var1 =~ /China.*right/s)
{
    print "var1 matches\n";
}

Perl正则表达式

my $var = "WeloveChina";
if ($var =~/We love China/)
{
    print "matches\n";
} 
print "---------------------\n"; 
if ($var =~/We love China/x)
{
    print "matches\n";
}

Perl正则表达式

模式替换:替换操作,返回值为布尔量。同匹配操作符一起,修改被替换的部分,不支持替换成特殊字符。

形式:s/<regexp>/<replacement>或s?<regexp>?<replacement>。

选项 描述
g 忽略所有可能的模式
i 忽略大小写
m 将串视为多行
s 将串视为单行
x

忽略模式中的空白

e 替换字符串作为表达式

 

 

 

 

 

 

 

 

my $var = "0abc1";
$var =~s/[a-zA-Z]+/3*2/e;
print $var."\n";
print "-----------------\n";
$var = "0abc1";
$var =~s/[a-zA-Z]+/3*2/;
print $var."\n";

Perl正则表达式

模式转化

同模式替换类似,用以弥补模式替换的不足。将string1中的字符依次、逐个替换为string2的字符,返回值为替换的字符数。

形式:tr/<regexp>/<replacement>或tr?<regexp>?<replacement>

my $var = "abcdfghicba";
print $var."\n";
my $result = $var =~tr/abc/def/;
print $var."\n";
print $result."\n";
print "-------------------\n";
$var = "abcdefghijklmn";
print $var."\n";
$var =~tr/abcd/ABCD/;
print $var."\n";

Perl正则表达式

模式转化的特殊功能

1、大小写互换

$str =~tr/a-zA-Z/A-Za-z/

2、特定字符计数

$str =~tr/0-9/0-9/
选项 描述
c 转化所有未指定字符
d 删除所有指定字符
s 多个相同的输出字符缩成一个

 

 

 

 

 

my $var = "123abc";
print $var."\n";
$var =~tr/0-9/ /c;
print $var."\n";
print "--------------------\n";
$var = "123abc";
print $var."\n";
$var =~tr/1b//d;
print $var."\n";
print "--------------------\n";
$var = "123abc3abc";
print $var."\n";
$var =~tr/0-9/ /cs;
print $var."\n";

Perl正则表达式

上一篇:mysqlhotcopy备份恢复


下一篇:又写了一段Perl