zoukankan      html  css  js  c++  java
  • PERL学习笔记---正则表达式

    要匹配某个模式(正则表达式)和$_的关系,可以将模式放在正斜线(//)之间,如下:
    $_ =“yabba dabba doo”;
    if(/abba/){
    print “It matched! ”;
    }

    表达式/abba/将在$_寻找这四个字母。如果找到,则返回true,在本例中,它出现了不止一次,但结果没什么不同。总之,
    如果找到了,则匹配上;如果没找到,则没匹配上。
    由于模式匹配通常返回true 或false,因此经常用在if 或while 的条件表达式部分。
    所有在双引号中的转义字符在模式中均有效,因此你可以使用/coke sprite/来匹配11 个字符的字符串coke, tab(制表符),
    sprite。

    ,点(.)是通配符,它可以匹配任何单个的字符,但不包括换行符(“ ”)。点(.)只匹配一个字符。、

    反斜线是第二个元字符。如果需要真正的反斜线,需要重复使用两个反斜线。

    。星号(*)表示匹配前一项0次或者多次。因此,/fred *barney/将匹配上fred 和barney
    之间有任意个制表位(tab)的字符串。

    如果希望包括不同的字符,怎么办呢?点(.)可以匹配任何单字符◆,因此.*将匹配任意字符任意多数。这就是说模式
    /fred.*barney/将匹配fred,和barney 之间有任意多个任意字符(不含换行符)的字符串。任意行如果前面有fred,后面有barney,
    其间为任意字符(字符串)都将匹配上。我们将.*叫做“任意字符串匹配模式”,因为任意的字符串均能被匹配上(不包括
    换行符)。

    星号的正是叫法是数量词(quantifier),意指其可以指代多个前面的项。它不是唯一的数量词,,加(+)也是。加(+)的意思是可
    以匹配前面一项的一个或多个:/fred +barney/意思是fred 和barney 之间由空格分开,且只能是空格。(空格不是元字符)。
    它不会匹配fredbarney,因为加(+)意指一个或多个,因此至少是一个。可以这样看待加(+):“最后一项,(可选的)至少还
    有一项。”

    还有第三个数量词,其限制性更强。它是问号(?),其含义是前面一个项出现一次,或者不出现。也就是说,前面这个项出
    现1 次或者0 次,此外不会有其它情况。因此,/barm-?bamm/只匹配:bamm-bamm 或bammbamm。这很容易记住:“前面
    的这个项,出现?或者不出现?”

    模式中的分组:括号也是元字符。在数学中,括号(())用来表示分组

    选择符: 竖线(|),在这种用法中通常被读作“或(or)”,意思是匹配左边的或者右边的。如果竖线左边没有匹配上,则匹配右边。因
    此,/fred|barney|betty/将匹配出现过fred,或者barney,或者betty 的字符串

    /fred( | )+barney/这样的模式,它将匹配fred,barney 以及中间由空格,制表符(tab),或者二者混合所组
    成的字符串

    字符类的简写

    有一些字符类出现的非常频繁,因此提供了其简写形式。例如,任何数字的类,[0-9],可以被简写为:d。因此,HAL 这

    个例子可以被写作/HAL-d+/。
    w 被称作“word’字符:[A-Za-z0-9_]。如果你的“words”由通常的字母,数字,下划线组成,那你将非常喜欢它。通常认
    为“word”由字母,连接符(-),撇号(')◆组成,我们希望能改变这种定义◆。因此使用它,请记住我们对“word”的定义,
    字母,数字,下划线组成。
    ◆至少,在英语中是这样。在其它语言中,其words 由不同的符号组成。查看perllocale 的帮助手册了解更多的信息。
    ◆当查看ASCII 编码的英语文本时,我们遇到单引号和撇号(')是相同字符的问题,因此很难说cat’是cat 和一个撇号( '),还是cat 后接单引
    号。这可能是计算机还不能接管世界的一个原因。
    当然,w 不能匹配单词,而只能匹配单个字符。为了匹配整个单词,需要后接加号。模式/fred w+ barney/将匹配fred,空
    格,一个“单词(word)”,然后是空格和barney。因此,如果fred 和barney 之间有一个单词◆,由单个空格分隔开,它将
    能匹配上。
    ◆我们将停止在word 上加引号;现在你已经知道其是由字母-数字-下划线组成的。
    你可能已经注意到在前一例中,如果能更加灵活的匹配空白将很方便。s 对于匹配空白(whitespace)将非常方便。它等价

    于[f ],其含5 个空白字符:格式符(form-feed);制表符(tab),换行符,回车,以及空格符。同其它简写符号一样,
    s 匹配此类中的单个字符,如果使用s*将匹配任何个数的空白(包括没有),或者s+匹配一个以上的空白(事实上,很少
    见到单独使用s,而不使用任何的数量词(*, +))。由于这些空白符看起来类似,因此可以使用这种简写形式,将它们统一处
    理。
     简写形式的补集
    某些时候,你可能希望得到这三种简写形式的补集。如果那样的话,你可以使用[^d], [^w], 和[^s],其含义分别是,非数
    字的字符,非word(记住我们对word 的定义)的字符,和非空白的字符。也可以使用它们对应的大写形式:D, W, S 来
    完成。它们将匹配它们对应的小写形式不能匹配上的字符。
    这些简写形式可以在字符类中使用,或者在大的字符类中的中括号里面使用。也就是说你可以使用/[dA-Fa-f]+/来匹配十六
    进制(底为16)的数字,它将ABCDEF(或者其小写形式)作为附加的数字(11 到15)。
    另一个类字符[dD],它的意思是任何数字,和任何非数字,则意指任何字符。这是匹配所有字符的一种通用方法,甚至包
    括换行符,而点(.)匹配除换行符以外的任何字符。而[^dD]则完全没用,因为它匹配既非数字也非非数字的字符,那什么
    也不是

    如果喜欢作者的文章,请关注"写代码的猿"订阅号以便第一时间获得最新内容。本文版权归作者所有,欢迎转载. 

  • 相关阅读:
    vim常用命令总结
    深度学习之 GAN 进行 mnist 图片的生成
    javascript 中的类型
    架构设计小思
    [前端]如何让图片等比例缩放,同时撑满父级容器的长或宽
    深度学习之 seq2seq 进行 英文到法文的翻译
    深度学习之 cnn 进行 CIFAR10 分类
    深度学习之 rnn 台词生成
    深度学习之 mnist 手写数字识别
    前端页面,使用 dom 鼠标拖拽画一个矩形和监听键盘
  • 原文地址:https://www.cnblogs.com/yuan1225/p/3782065.html
Copyright © 2011-2022 走看看