优秀的手机游戏下载!
首页 Perl正则表达式常用语法总结

Perl正则表达式常用语法总结

发布时间:2024-11-25 14:24:31 编辑:手游哥 浏览:517

操作符

m/…/     模式匹配操作符

s/…/…/    模式替换操作符

qr/…/     预编译正则表达式

=~        绑定操作符

普通元字符

.        通配符,可匹配除\\n外的一个任意字符

\\        用于字符转义

|        择一竖线

\\Q…\\E    转义\\Q至\\E之间的所有元字符

字符集

[…]          肯定型字符集

[^…]         否定型字符集

–           可用于表示一系列连续字符

[-…\\\\…\\^]    字符集中表示真正的“-”、“\\”与“^”

字符集简写

\\d与\\D     基本相当于[0-9]与[^0-9]

\\w与\\W    基本相当于[A-Za-z0-9_]与[^A-Za-z0-9_ ]\\s与\\S      空白字符集(包括空格、\\n等)及其反义字符集

量词

*                  可重复匹配0至任意多次

+                  可重复匹配1至任意多次

?                  可重复匹配0或1次

{1,5}               通用量词,可重复匹配1至5次

{1,}                无重复匹配次数上限,此处相当于量词“+”

{5}                 固定匹配5次

*?、+?、?、{…}?    忽略优先量词

*+、++、?+、{…}+    占有优先量词

与小括号相关的语法

(…)             普通捕获组

(?: …)           非捕获组

(?&gt…)           固化分组

(? …)     命名捕获组

(?i-m: …)        启用i修饰符并关闭m修饰符的非捕获组

((?i-m) …)       启用i修饰符并关闭m修饰符的捕获组

\\1、\\2、\\3      普通绝对反向引用

\\name          反向引用命名捕获组

\\g{…}、\\k&lt…&gt    支持相对反向引用的写法(二者略有差别)

$1、$2、$3      使用绝对编号的捕获变量

$+{name}        通过%+散列调用命名捕获组内容

$`、$&amp、$\’      匹配前字段、匹配字段与匹配后字段(使用会大幅降低正则引擎的速度)

修饰符

/i    模式字符忽略大小写

/m   启用行首尾锚位

/x    启用宽松排列模式

/g    全局匹配、全局替换

/o    只编译一次

锚位

\\A        绝对开头锚位

\\Z        绝对末尾锚位

\\z        忽略末尾换行符的末尾锚位

^、$      未开启/m时,相当于\\A与\\z,开启\\m后为行首尾锚位

\\b        单词边界锚位

\\B        非单词边界锚位

\\G        锚位到上一次成功匹配的结束位置

(?= …)     肯定顺序环视

(?! …)     否定顺序环视

(?&lt= …)    肯定逆序环视

(?

优先级

小括号 &gt量词 &gt锚位和序列 &gt择一竖线 &gt原子

樱雨楼

完于:2016.3.30

Perl正则表达式常用语法总结

perl 代码中 变量 匹配变量的正则表达式的写法

首先,g{n}是perl

5.10的反向引用新写法,n是想要反向引用的组号。没有g{n}写法的时候,需要用\\1,\\2,\\3等来表示相对应的反向引用,数字代表括号出现的先后,即为“组号”。在你给出的模式中,只出现了一个括号,所以{}里应该是1,它指“引用第1个括号所匹配的内容”。你理解的可能是,因为b出现2次所以括号里应该是2,错在没理解g{n}中n的含义。另外,这个模式比较简单,其实没必要用g{},只需/a(.)\\1a/即可。

为什么说perl的正则表达式功能比Python强大

说一下你的错误:@pattern是数组变量,数组变量访问的形式,要么是@pattern访问全部变量,要么利用$pattern[$i]的形式访问。你直接写$pattern是访问不到任何东西的。所以需要对@pattern再加一个循环进行正则匹配。下面是我写的perl代码,直接读取数组型字符了,为方面没有读入文件,和你说的问题应该类似。结果图也附上了,不知道和你说的是否符合。

#!/usr/bin/perl

 

@configfile = (\”I\”,\”am\”,\”a\”,\”patten1\”,\”Not\”,\”Apatten\”)

@patten = (\”patten1\”,\”patten2\”,\”patten3\”)

$i=0

$j=0

foreach my $line (@configfile)

{

      foreach my $pad1 (@patten)

{

  if ($line =~ /$pad1/){

          print \”\\$configfile[$i]与\\$patten[$j]匹配\\n\”

   }

        $j++

         }

$j=0

$i ++

}

perl正则表达式 捕获

最大的分别就是.. 速度!

从各种的测试都显示, perl 的正则处理依然是最快的 (不只比 python) , 下面的实测可以去看看

https: 斜斜 stuffivelearned 点 org 斜 doku.php?id=programming%3ageneral%3aphpvspythonvsperl

其实 perl 本来就是正则的鼻祖, 它最初的开发的原意很大程度也是为了正则

至於为甚麼比 python 快其实不难想像

Perl 不是 OO 语言(虽然有 OO 的玩法), 所以用到正则时, 正接就开始跑, 不用继承一堆有的没的属性和方法. 至於 python 还要先把字串 compile 了做一个物件, 才开始做正则, 在底层自然又多了一重功夫

Python 的正则要靠模块来完成, Perl 的正则却已在 perl 解释器的心脏里, 谁会起动的更快就很明显了. 当然, 除了 C Python 还算最快之外, 其他如 JPython, Iron Python 这些要靠 framework 来起动的就必然更慢了

另外就是… 连击和助攻, perl 的正则很可以直接当成 expression (=~ 和 !~ ) 来用, 如:

use utf8

$wantId = \”陈大文\”

die \”帐号不能用奇怪字符\” unless $wantId =~ /^[\\w\\d]+$/ 

#或者 

%user = ( 

    1 =&gt { Name =&gt \”王子\” }, 

    2 =&gt { Name =&gt \”小王子\” } 

    3 =&gt { Name =&gt \”王妹\” } )

@姓王的 = grep { $user{$_}{Name} =~ /^王/ } keys %user 

# @姓王的 = ( 1, 3)

# 又或者

%mask = ( 1 =&gt \”M\”, 2 =&gt \”X\”, 3 =&gt \”B\” )

$password = \”321\” #普通密码

$maskedPw = undef #加密密码

$password =~ s/(.)/$maskPw .= $mask($1)/eg 

# maskedPw = \”BXM\”上面几例, 试问用 python 要写多少行才做到用样的效果呢.. 不过, 这多少语言层次的问题, 姑且另作别论了.

说实话,这个我也研究半天,虽然最终搞明白了,但这种肯定真正编程时是肯定不提倡使用的,正则非常巧妙,几个符号缺一不可。

首先搞懂顺序问题:

从perlre文档里面关于capture buffers的描述可以看出:Capture buffers are numbered from left to right,编号是从左到右的。也就是说,对于你这个表达式,最外面是$1, 中间是$2, 最里面是$3。

但下面还有一句:

but inside this construct the numbering is restarted for each branch.

编号会重新开始,也就是以前的编号里的内容就被替换掉了。

# before  —————branch-reset———– after

/ ( a )  (?| x ( y ) z | (p (q) r) | (t) u (v) ) ( z ) /x

# 1            2         2  3        2     3     4

然后程序解析正则,先看到的s…ly,于是找到了[softly],此为$3,然后要求0或多个空格,正好后面有一个空格,所以解析到了[softly ],此为$2。这时候关键来了,后面跟一个单纯的*。都知道*表示0或多次,但一般前面有个引导字符,表示你要0或多个什么字母,但这里前面没有字母,有的是一串的表达式,所以程序发现,我需要0或多个这种结构(s…ly)\\s*的串,所以只能接着找看后来有没有这样的串。

所以程序接着找到[slowly],$3的内容被替换为这个,随后同样的$2被替换为[slowly ],然后再找,直到第4次,$3被替换为[subtly],$2同样是[subtly],查找结束,程序说,你要求0到多个(s…ly)\\s*结构的串,我一共给你找到了4个这样的串,分别是:[softly ][slowly ][surely ][subtly],那么$1就是几个这样串的组合,就是完整的[softly slowly surely subtly]

说实话,我花了10分钟搞明白这个,自己都感觉挺无聊的,有时候不如折腾点有用的东西。。。。

以上就是关于Perl正则表达式常用语法总结全部的内容,如果了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

更多相关资讯

操作符 m/.../     模式匹配操作符 s/.../.../    模式替换操作符 qr/.../     预编译正则表达式 =~        绑定操作…
查看详情
操作符 m/.../     模式匹配操作符 s/.../.../    模式替换操作符 qr/.../     预编译正则表达式 =~        绑定操作…
查看详情
操作符 m/.../     模式匹配操作符 s/.../.../    模式替换操作符 qr/.../     预编译正则表达式 =~        绑定操作…
查看详情
相关资讯
猜你喜欢