ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Perl正则表达式

2021-05-03 22:33:36  阅读:264  来源: 互联网

标签:字符 匹配 正则表达式 Perl var print my 元字符


一、正则表达式的定义

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

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

二、正则表达式的应用

1、简单模式

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

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

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

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

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";}

模式分组

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

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

/(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";}
  

正则表达式中的元字符

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

单字符与数字
元字符所代表含义
.匹配除换行符以外的任意字符
[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表示程序本身

模式匹配的选项

选项

描述
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";
 }

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";
      }
}

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";
}

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

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

形式: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";

模式转化

同模式替换类似,用以弥补模式替换的不足。将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";

模式转化的特殊功能

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,var,print,my,元字符
来源: https://blog.csdn.net/weixin_42780570/article/details/116373440

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有