加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

perl模式匹配学习笔记

发布时间:2020-12-15 21:03:50 所属栏目:大数据 来源:网络整理
导读:优先级 1.在此优先级表的最顶端是括号:(()),在分组和引用内存值的时候使用。括号内部的任何部分比括号外的部分结合更紧 密。 2.第二级是数量词。这里有星号(*),加号(+),问号(?)以及由花括号表示的数量词,如{5,15},{3,},{5}等。它们通常 和前

优先级

1.在此优先级表的最顶端是括号:(()),在分组和引用内存值的时候使用。括号内部的任何部分比括号外的部分结合更紧
密。
2.第二级是数量词。这里有星号(*),加号(+),问号(?)以及由花括号表示的数量词,如{5,15},{3,},{5}等。它们通常
和前一项元素结合。
3.第三级的是锚定和序列(sequence)。锚定包括(^) 表明字符串的开头,($)表明结尾,(b)词界符,(B)非词界符。序列(一
个元素紧接着一个元素)实际上是一种操作,虽然它没有使用元字符。这段话的含义是一个单词中的字母结合更紧密,就
像锚定紧贴字母一样。
4.优先级最低的是竖线(|),表示或。由于其优先级最低,它通常将模式划分成几个部分。它在优先级最底端是因为我们希
望像|/fred|barney/里面的字母比或(|)结合更紧密。如果或(|)的优先级比序列的优先级更高,那么,上述模式的含义是匹配fre,
接着是d 或者b,然后是arney。因此,或(|)的优先级最低,字母序列的优先级要高些。


Perl模式匹配

模式指在字符串中寻找的特定序列的字符,由反斜线包含:/def/即模式def。

一、Perl模式匹配的语法

m/def/
例如if(m/def/){}这是在$_中寻找def匹配.如果将模式括起来的字符(称为界限符)是斜杠,那么编写Perl模式匹配代码时也可以不带m。
/def/
Perl模式匹配的操作符=~,!~若在该字符串中找到了该模式,则返回非零值,即true,不匹配则返回0,即false。!~则相反。这两者适合条件控制.
例如?

 
 
  1. if($question=~/please/)?? ?
  2. {?? ?
  3. print("Thankyouforbeingpolite!n");?? ?
  4. }?? ?
  5. ?

二、Perl模式匹配中的特殊字符

2.1+

+用于使前面的字符与后面的字符至少匹配一次,也可以任意次地进行匹配.类似于windows中*例如/d+g/能匹配的dog,dogg,dooooog/ab+/在字符串abbc中匹配的将是abb,而不是ab。

2.2[]和[^]

[]意味着匹配一组字符中的一个
^表示除其之外的所有字符
例如/w[abcd]s/能匹配的was,wbs,wcs,wds
/w[^ab]s/不能匹配的was,wbs
也可以写成如下形式
/w[a-z0-9A-Z]s/

2.3字符*和?

它们与+类似,区别在于*匹配0个、1个或多个相同字符,?匹配0个或1个该字符。
例如/de*f/匹配df、def、deeeef等;/de?f/匹配df或def。

2.4位置通配符(锚模式)

^或A仅匹配串首
$或Z仅匹配串尾
b匹配单词边界
B单词内部匹配
例如:/^def/只匹配以def打头的字符串,/$def/只匹配以def结尾的字符串,结合起来的/^def$/只匹配字符串def(?)。A和Z在多行匹配时与^和$不同。

b在单词边界匹配:/bdef/匹配def和defghi等以def打头的单词,但不匹配abcdef。/defb/匹配def和abcdef等以def结尾的单词,但不匹配defghi,/bdefb/只匹配字符串def。注意:/bdef/可匹配$defghi,因为$并不被看作是单词的部分。

B在单词内部匹配:/Bdef/匹配abcdef等,但不匹配def;/defB/匹配defghi等;/BdefB/匹配cdefg、abcdefghi等,但不匹配def,defghi,abcdef。

2.5字符转义类

d任意数字[0-9]
D除数字外的任意字符[^0-9]
w任意单词字符[_0-9a-zA-Z]
W任意非单词字符[^_0-9a-zA-Z]
s空白[rtnf]
S非空白[^rtnf]

2.6.

字符"."匹配除换行外的所有字符,通常与*合用。

2.7匹配指定数目的字符

字符对{}指定所匹配字符的出现次数。
如:/de{1,3}f/匹配def,deef和deeef;
/de{3}f/匹配deeef;
/de{3,}f/匹配不少于3个e在d和f之间;
/de{0,3}f/匹配不多于3个e在d和f之间。

2.8指定选项

字符"|"指定两个或多个选择来匹配模式。如:/def|ghi/匹配def或ghi。
这些转义符有一定的操作顺序:
()模式内存
+*?{}出现次数
^$bB锚
|选项

2.9模式次序变量

在Perl模式匹配后调用重用部分的结果可用变量$n,全部的结果用变量$&。
$string="Thisstringcontainsthenumber25.11.";
$string=~/-?(d+).?(d+)/;#匹配结果为25.11
$integerpart=$1;#now$integerpart=25
$decimalpart=$2;#now$decimalpart=11
$totalpart=$&;#nowtotalpart=25.11

三、Perl模式匹配选项

g匹配所有可能的模式
i忽略大小写
m将串视为多行
o只赋值一次
s将串视为单行
x忽略模式中的空白

3.1、匹配所有可能的模式(g选项)

@matches="balata"=~/.a/g;#now@matches=("ba","la","ta")
匹配的循环:
?

  • while("balata"=~/.a/g){ ?
  • match=$&; ?
  • print("$matchn"); ?
  • } ?
  • 结果为:
    ba
    la
    ta
    当使用了选项g时,可用函数pos来控制下次匹配的偏移:
    $offset=pos($string);
    pos($string)=$newoffset;

    3.2、忽略大小写(i选项)例

    /de/i匹配de,dE,De和DE。

    3.3、将字符串看作多行(m选项)

    在此情况下,^符号匹配字符串的起始或新的一行的起始;$符号匹配任意行的末尾。

    3.4、只执行一次变量替换例

  • var=1; ?
  • line=<STDIN>; ?
  • while($var10){ ?
  • result=$line=~/$var/o; ?
  • line=>; ?
  • $var++; ?
  • } ?
  • 每次均匹配/1/。

    3.5、将字符串看作单行例

    /a.*bc/s匹配字符串axxxxxnxxxxbc,但/a.*bc/则不匹配该字符串。

    3.6、在模式中忽略空格

    /d{2}([W])d{2}1d{2}/x等价于/d{2}([W])d{2}1d{2}/。

    四、Perl模式匹配的附加操作

    4.1替换操作符

    语法为s/pattern/replacement/,其效果为将字符串中与pattern匹配的部分换成replacement。如:
    $string="abc123def";
    $string=~s/123/456/;#now$string="abc456def";
    在替换部分可使用模式次序变量$n,如s/(d+)/[$1]/,但在替换部分不支持模式的特殊字符,如{},*,+等,如s/abc/[def]/将把abc替换为[def]。

    替换操作符的选项如下表:

    g改变模式中的所有匹配
    i忽略模式中的大小写
    e替换字符串作为表达式
    m将待匹配串视为多行
    o仅赋值一次
    s将待匹配串视为单行
    x忽略模式中的空白

    注:e选项把替换部分的字符串看作表达式,在替换之前先计算其值,如:
    $string="0abc1";
    $string=~s/[a-zA-Z]+/$&x2/e;#now$string="0abcabc1"

    4.2翻译操作符

    这是另一种替换方式,语法如:tr/string1/string2/。同样,string2为替换部分,但其效果是把string1中的第一个字符替换为string2中的第一个字符,把string1中的第二个字符替换为string2中的第二个字符,依此类推。如:
    $string="abcdefghicba";
    $string=~tr/abc/def/;#nowstring="defdefghifed"
    当string1比string2长时,其多余字符替换为string2的最后一个字符;当string1中同一个字符出现多次时,将使用第一个替换字符。

    翻译操作符的选项如下:

    c翻译所有未指定字符
    d删除所有指定字符
    s把多个相同的输出字符缩成一个

    如$string=~tr/d//c;把所有非数字字符替换为空格。$string=~trt//d;删除tab和空格;$string=~tr/0-9//cs;把数字间的其它字符替换为一个空格

    (编辑:李大同)

    【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

      推荐文章
        热点阅读