分享好友 编程语言首页 频道列表

Regex in Perl

perl  2023-02-09 10:270


regex literal
  代表正则文字, 就是 m/regex/ 部分中的 regex, 这部分有自己的解析规则. 用 Perl 的行话就是 "表示正则含义的双引号字符串(regx-aware double-quoted string)", 及处理后传递给正则引擎的结果.

正则文字支持的特性:

  1. 变量插值.       如 m/$str/, 其中的 $str 会被扩展成变量内容, 但 $str 内部的变量不会被展开. 但不支持散列内插. (Perl 本身就不支持散列内插).

  2. 大小写转换.    如 m/\l$str/ 或 m/\U$str\E/ 等. 其等价函数是 \l => lcfirst(), \u => ucfirst(), \L .. \E => lc(), \U .. \E => uc().

  3. 文字文本.       如 m/\Q$str\E/.                      其等价函数是 qutoemeta()

3.1 希望匹配的是此模式内所包含的变量所代表的字符, 而不是该变量中的正则表达式.
3.2 对于不能识别的转义字符, \Q .. \E 将会导致警告 "unrecognized escape"

  4. 命名的 Unicode 字符


其他

  在 match 操作中, 当分隔符是 '/' 或 '?' 时, 可省略 m/regex/ 中的 m.

  不能对本作用域的局部变量调用 local, 但是可以对其更外层作用域的局部变量调用 local.

  local 是行为, 而 my 既是行为也是声明.

与正则相关的特殊变量
Symbol Effect Default
$' 匹配之前的文本
$& 匹配的文本 等价于 substr($text, $-[0], $+[0] - $-[0])
$` 匹配之后的文本
$1 第一组匹配文本
$2 第二组匹配文本

$^N 括号最后结束的一组匹配文本
$+ 编号最大的一组匹配文本
$" 数组内插到标量时, 默认的分隔符 空格
@- 各个捕获的起始位置 (0 是匹配的起始)
@+ 各个捕获的结束位置后的一位 (0 是匹配的结束后的一位)  


(\w+)
(\w)+

  如 "\n\n\nq1w2e3r4\t\t\t" =~ (\w+)

  两者匹配的内容是相同的. 区别在于捕获括号中的内容不同. 前者将捕获整个可匹配的字串, 因此, 例子中 $1 的值是 "q1w2e3r4". 后者则会迭代捕获新的内容, 因此 $1 只保留最后一个字符 "4".

(x?)(x)?

  在 (x?) 中, 捕获必然发生, 但是其捕获的内容可以为空字符, 也就是 "". 但是在 (x)? 中情况则不同, 因为捕获不是必须发生, 因此 $1 的值可能会出现 def 或 x.


qr 运算符生成 regex 对象
  主要用来把正则表达式封装为一个单元, 构建更强大的正则表达式, 以提高效率。
  regex 对象一旦封装完成, 对应的匹配模式就不能更改了。即: 不能向已构建的正则对象添加新的模式

my $regex = qr/$var/                  # 支持普通变量内插
my $string = qr/$regex/ # 也支持嵌套的 regex 对象内插  

  在 scalar context 中, 正则对象被认为是一个含有模式说明符的正则表达式字符串。


match 运算符 m/ regex /xismgc

  在 scalar context 中, =~ 返回 0 或 1. 代表不匹配和匹配。

  在 list context 中, =~ 返回捕获所匹配的内容

#!/usr/bin/perl -w
use 5.010 ;


# 拆分 IP 地址
my $ip = "192.168.1.1" ;
my ($ip1, $ip2, $ip3, $ip4) = $ip =~ m/(\d+)/g ;            # list context
say $ip1 ;                  # 192
say $ip2 ;                  # 168
say $ip3 ;                  # 1
say $ip4 ;                  # 1


字符串中的 “当前位置” 属性与 /g 修饰符

  每个字符串都有一个 “当前位置” 属性, 表示在正则表达式应用到这个字符串时, 驱动程序的开始锚点。可通过 pos() 设定与获得。任何创建和修改字符串的行为都会造成 “当前位置”被重置。即,“当前位置” = undef, 从而指向字符串的起始。

  /g 修饰符的作用就是:

    如果本次成功匹配, 则将 ”当前位置“ 设置为成功匹配结束的位置。

    如果匹配失败,则将重置 “当前位置” 。即, 将 “当前位置” 设置为 undef, 此时意为传动装置将从字符串开头开始驱动。

#!/usr/bin/perl -w
use 5.010 ;


my $str = "192.168.1.1" ;
$str =~ m/\w+/g ; # 将匹配 192
my $pos = pos($str) ;

say $pos ; # 3

/gc 修饰符

  /c 修饰符指: 当匹配失败后, 不修改 “当前位置” 属性。

  当指定 /g 修饰符时才可指定 /c 修饰符。所以常常说 /gc。


\G 修饰符

  告诉传动装置, 不要启动驱动过程, 如果在此处(即字符串的 “当前位置” 属性)无法匹配, 则宣告失败。

  不能和全局性多选结构一起使用, 否则结果是未定义的。



substitution 运算符 ( s/ regex / replacement /xismge )

  match 可以省略 m, 但是 substitution 不能省略 s。

  substitution 无论在 scalar context 中还是 list context 中, 返回值都表示替换的次数, 或空字串。

/g 修饰符
  全局替换。

/e 修饰符
  replacement 在 scalar context 中重新求值。

#!/usr/bin/perl -w
use 5.010 ;


my $str = "current: time." ;
$str =~ s/time/localtime/eg ;    # 对 localtime 进行求值
say $str ; # current: Thu Oct 13 10:08:31 2011.

  
  多次使用 /e 修饰符, 表示对 replacement 进行多次求值。

#!/usr/bin/perl -w
use 5.010 ;


my $str = "Three times evaluate: var" ;
my ($var1, $var2, $var3) = ('$var2', '$var3', 3) ;
$str =~ s/var/$var1/eeeg ;
say $str ; # Three times evaluate: 3

Perl  的专有特性
动态正则结构: (??{ perl code })
   每次遇到这种结构, 就会立即执行 perl code 代码. 执行的结果将立即被作用于当前的匹配.
  perl code 的返回值会被认为是正则文字的一部分. 
"3xxxyy" =~ m/(\d)(??{"x{$1}"})/ ;          # 可以匹配 "3xxx"

应用:
  匹配任意深度的嵌套.
#!/usr/bin/perl -
use 5.010 ;

my $x = "int fun(int a, int (*pfun)(char b))" ;
my $level_n ; # 先声明, 下面才能使用
$level_n = qr/\((?>[^()]+|(??{$level_n}))*\)/ ;

$x =~ m/$level_n/ ;
say $& ;

Regex in Perl 

解释:
第一阶段

  首先在 fun( 的开括号处遇到匹配,
  接着进入固化分组, [^()]+ 匹配了 int fun(int a, int (*pfun)(char b))
第二阶段
  再遇到开括号, 因为 int ( 这个开括号无法匹配 [^()]。 因此进入第一层多选结构 (??{$level_n}) 的判定。 这个分支是动态正则结构, 因此会立即进入动态结构进行匹配操作。
  此时动态正则结构 (??{$level_n}) 展开为自身 “\((?>[^()]+|(??{$level_n}))*\)”, 并对 "(*pfun)(char b))" 进行匹配。
  当 (*pfun 遇到 $level_n 中的 “\((?>[^()]+|(??{$level_n}))*\)” 时, 得到匹配, 因此继续向后进行匹配。
  (*pfun 因 “\((?>[^()]+|(??{$level_n}))*\)” 得到匹配。
  此时, 遇到 "(*pfun)" 中的 “)”. 且正则文字中的 [^()]+ 无法匹配, 并进入第二层 “(??{$level_n})” 多选分支, 但是字符 “)” 对于多选分支展开后的正则文字 “\((?>[^()]+|(??{$level_n}))*\)” 依然得不到匹配, 因此退出第二层多选分支。
  驱动程序前进, “)” 遇到第一层的 “\((?>[^()]+|(??{$level_n}))*\)”, 得到匹配。 完成并退出第一层多选分支。
第三阶段
  此后同理。  

 嵌套代码结构: (?{ arbitrary perl code })
  每次遇到此结构, 立即执行 perl 代码. 
  此结构较 "动态正则结构" 更为通用, 因为不需要 arbitrary perl code 的返回值作为正则文字的部分进行匹配. 在调试中十分常见.
 
#!/usr/bin/perl -
use 5.010 ;

my $x = "have a nice day" ;
$x =~ m{(?{print "."})day$}x ; # 应该会输出 13 个 "." 号, 但是在 windows 下使用 strawberry perl, 只输出了一个 "."

查看更多关于【perl】的文章

展开全文
相关推荐
反对 0
举报 0
评论 0
图文资讯
热门推荐
优选好物
更多热点专题
更多推荐文章
Linux下安装Perl和Perl的DBI模块
今天在虚拟机测试shell脚本的时候,有些命令使用不了。比如说 mysqlhotcopy ,它提示Perl的版本太低。我用的 RedHat9 的Perl才5.8.0版本。。。(2002年以前的)严重过时。所以重新安装了新版本的 Perl,过程记录如下: 1、在官方网站下载新版本的源码包:http:

0评论2023-03-16464

Perl 与Form
说明事项: 這個範例用來說明如何經由網頁上的HTML form 表單元件來呼叫伺服器端的perl 程式。这个范例用来说明如何经由网页上的HTML form 表单元件来呼叫伺服器端的perl 程式。首先在網頁上設計表單元件,這個範例是設計一個按鈕,其原始碼如下:首先在网页

0评论2023-02-10545

Perl学习 perl培训
http://www.sun126.com/perl5/perl5-1.htm翻译: flamephoenix 第一章 概述一、Perl是什么?二、Perl在哪里?三、运行四、注释一、Perl是什么?  Perl是Practical Extraction and Report Language的缩写,它是由Larry Wall设计的,并由他不断更新和维护,用

0评论2023-02-10506

- calm_水手">Perl中的箭头符-> - calm_水手
Perl中的箭头符-2012-05-21 17:14 calm_水手 阅读(623) 评论(0) 编辑 收藏 举报  有两种用法,都和解引用有关。第一种用法,就是解引用。根据 - 后面跟的符号的不同,解不同类型的引用,-[] 表示解数组引用,-{} 表示解散列引用,-() 表示解子程序引

0评论2023-02-09731

perl脚本语言学习 perl脚本调用perl脚本
来公司的第二个星期便看了一下perl语言,发现掌握一门脚本语言还是非常有用的。到现在为止已经入职两个月,用perl脚本做了这些活:1. 修改了公司的一个爬取网页源代码的脚本2. 改进了一个出特征库的脚本,根据svn status的状态,来优化,将只需要添加的DB的数

0评论2023-02-09317

Perl模块的安装方法 perl 安装模块
1. 下载离线安装包 *.tar.gz的形式解包后,#perl Makefile.PL#make#make install2. 在联网的情况下,通过CPAN安装# perl -MCPAN -e shellcpan install PAR::Packer 

0评论2023-02-09909

Perl像C一样强大,像awk、sed等脚本描述语言一样方便。
Perl是由Larry Wall设计的,并由他不断更新和维护的编程语言。Perl具有高级语言(如C)的强大能力和灵活性。事实上,你将看到,它的许多特性是从C语言中借用来的。Perl与 脚本语言一样,Perl不需要编译器和链接器来运行代码,你要做的只是写出程序并告诉Perl

0评论2023-02-09370

27-Perl 进程管理
1.Perl 进程管理Perl 中你可以以不同的方法来创建进程。本教程将讨论一些进程的管理方法。你可以使用特殊变量 $$ 或 $PROCESS_ID 来获取进程 ID。%ENV 哈希存放了父进程,也就是shell中的环境变量,在Perl中可以修改这些变量。exit() 通常用于退出子进程,主

0评论2023-02-09436

在perl中简单的正则匹配 正则匹配或的使用
(一)、在perl中关于元字符的匹配元字符代表含义点号( .)匹配处换行符以外的任何单字符星号(*)匹配前面的内容零次或多次反斜线屏蔽元字符的特殊含义。\\代表\,\.匹配点号.*匹配所有的字符串加号(+)匹配前一个条目一次以上问号(?)表示前面一个条目可

0评论2023-02-09908

Perl WEB 开发之 Template
由于工作需要, 最近开始使用Perl来作为服务器脚本来处理Web 请求。系统采用的Template 来做Web page 的模板,用来简化繁琐但并不困难的HTML标签的编写。Question 1: Template Toolkit 是啥?Template Toolkit是一组Perl Module的集合, 它实现了一种快速的

0评论2023-02-09418

Perl到底是什么意思? perpol意思
学习perl也有一段时间了,如果连perl是什么意思都不知道,那就太汗颜了,听好啦!perl == Practical Exstraction and Report Language,中文叫做实用抽取和报表语言。

0评论2023-02-09437

perl-cgi-form2
代码:         #!/usr/local/bin/perl        use CGI ':standard';        print header;        print start_html("Example CGI.pm Form");        print "h1 Example CGI.pm Form/h1\n";      

0评论2023-02-09501

Perl实战(一) perl进阶
在Perl中,我们可以通过uc,lc,\U,\L来修改变量的值。其中uc,\U可以将变量中的字母全部转换为大写。              lc,\L可以将变量中的字母全部转换为小写。              $big = "\U$var";       $big = uc($var);  

0评论2023-02-09685

Perl多线程(2):数据共享和线程安全 多线程epoll
线程数据共享在介绍Perl解释器线程的时候一直强调,Perl解释器线程在被创建出来的时候,将从父线程中拷贝数据到子线程中,使得数据是线程私有的,并且数据是线程隔离的。如果真的想要在线程间共享数据,需要显式使用threads::shared模块来扩展threads模块的功

0评论2023-02-09683

Linux下安装与使用本地的perl模块 centos安装perl
在使用Linux或是unix时,perl是一个非常有用的脚本的语言。关于perl的模块安装,网上也有很多介绍,一方面可以通过不同套件自带的软件安装工具安装,一方面可以通过cpan安装,再者就是可以直接编译源代码。 这样,对于拥有root权限的用户来说,没有任何问题

0评论2023-02-09497

Perl_Tkx_Canvas绘图功能函数介绍
1.画画布:     $canvas = $mw-new_tk__canvas;2.画线:         $canvas-create_line(10,10,200,50,-fill=”red”,-width=3);配置item参数:       $canvas-itemconfigure($id, -fill = "blue", -width = 2);3.画椭圆         “ova

0评论2023-02-09658

perl: warning: Falling back to the standard locale ("C").
/********************************************************************************** *perl: warning: Falling back to the standard locale ("C"). * 说明: * 使用debootstrap的时候,遇到这个问题,记录解决方法。 **2017-2-18 深圳 南山平山村 曾剑锋

0评论2023-02-09574

Perl操作Mysql数据库 perl操作excel
一. 安装DBI模块步骤1:从TOOLS栏目中下载DBI.zip,下载完后用winzip解开到一个temp目录,共有三个文件:ReadmeDBI.ppdDBI.tar.gz步骤2: 在DOS窗口下,temp目录中运行下面的DOS命令:ppm install DBI.ppd 如果提示无效命令,可在perl/bin目录下运行 二. 安装DBD

0评论2023-02-09348

更多推荐