Perl语言学习(五)Perl正则表达式

1、Perl正则表达式简介

  • 正则表达式的起源

    • 1956年,论文《神经网络事件的表示法》首次提出“正则集的代数”表达式

    • 英文名:regular expression

    • Ken Thompson将正则表达式引入Unix

    • 此后广泛应用于Unix或者类Unix工具中

    • 主流操作系统、主流开发语言都嵌入了正则表达式

  • 正则表达式的定义

    • 正则表达式,就是用某种模式去匹配一类字符串的一个公式
    image.png
    • 给定一个正则表达式和另一个字符串,我们可以达到如下的目的:

      • 给定的字符串是否符合正则表达式的过滤逻辑(称作为“匹配”)

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

  • 常用工具中的正则表达式

    • 记事本中的正则表达式:查找、替换实际上就是正则表达式

    • World中正则表达式:查找、替换

    • Vi中的正则表达式:查找、替换

    • 正则表达式无处不在

      • 不同环境中所支持的功能可能不太一样


        image.png
  • 正则表达式的特点

    • 灵活性、逻辑性和功能性非常的强

    • 主要应用对象是文本

    • 可以迅速的用极简单的方式达到字符串的复杂控制

    • 对于刚接触的人来说。比较晦涩难懂

2、Perl正则表达式的应用

  • 正则表达式的语法

    • 一个正则表达式也称为一个模式

    • 简单模式

      • 如果模式匹配的对象是$_,把模式写在斜线/中

      • 能匹配上,返回值为1,否则为0

      • $_ = "hello World"; if(/"World"/) {printf"It matched"};

      • 如果匹配项本身含有斜线,使用反斜线

    • Unicode属性

      • 利用字符的属性进行匹配

      • \p{属性名}表示该属性的模式

      • 匹配空格,使用Space属性:\p{Space}

      • 匹配数字,使用Digit属性:\p{Digit}

      • 匹配十六进制数,使用Hex属性:\p{Hex}

      • 也可以使用\P来表示匹配不包含属性的部分,\P{属性},同不匹配不一样

    • 模式分组

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

      • 括号、反斜线、数字编号可以组成捕获组的模式

      • 括号内的内容作为元字符,用反斜线后面加数字表示再此匹配

      • 反斜线也不一定在括号后面

      • /(world)\3/表示匹配:worldworldworldworld

      • 择一匹配,使用竖线|表示匹配时候的”或“

      • /(hello|world)/表示匹配“hello”或“world"

  • 正则表达式的应用场合

    • 针对所有的字符串处理,如特定字符串、重复、计数、统计等

    • 电话号码匹配

    • 姓名,邮箱匹配

3、Perl正则表达式和元字符

  • 正则表达式中的元字符

    • 元字符是一种特殊字符

    • 起通配作用

    • 在他们前面加上反斜杠\,这些元字符就会失去其特殊含义

  • 元字符列表

    • 字符类:单字符与数字


      image.png
    • 字符类:空白字符


      image.png
    • 字符类:锚定字符


      image.png
    • 字符类:重复字符


      image.png
    • 字符类:替换字符


      image.png
    • 字符类:其他字符


      image.png
  • 元字符的优先级

    • 当模式中包含多种元字符时,根据优先级顺序来判断匹配量


      image.png

4、Perl正则表达式的形式

  • 模式匹配

    • 得到“是否匹配”的结果,无其他操作

    • 形式为:m/<regexp>/; 或者/<regexp>/; 或者m?<regexp>?

    • 同匹配操作符一起,用来判断是否匹配后面的字符串

    • 匹配的表达式中,括号部分的匹配项用$标号表示

    • 匹配上,返回值为1,否则为0

    • $test = "China"; $target = ".*ina"; $test =~ m/$target/ ##该表达式的返回值为1

     $string = "This string contains the number 25.11";
     $test = $string =~ /?(\d+)\.?(\d+)/;
     print $string."\n";    ## This string contains the number 25.11
     print $test."\n";   ## 1
     $a = $1;
     $b = $2;
     ​
     print $a."\n";   ## 25
     print $b."\n";   ## 11
    
    • 模式匹配的选项:


      image.png
  • 模式替换

    • 替换操作,返回值为布尔值

    • 形式为:s/<regexp>/<replacement>; 或者s?<regexp>?<replacement>

    • 同匹配操作符一起,修改被替换的部分

    • 不支持替换成特殊字符

    • 模式替换的选项


      image.png
      $var = "0abc1";
      $var =~ s/[a-zA-Z]+/3*2/e;
      print $var."\n";   ## 061
      ​
      $var =~ s/[a-zA-Z]+/3*2/;
      print $var."\n";   ## 03*21
      
  • 模式转化

    • 同模式替换类似,用以弥补模式替换的不足

    • 形式为:tr/<regexp>/<replacement>; 或则tr?<regexp>?<replacement>

    • 将string1中的字符依次,逐个替换为string2的字符

    • 返回值为替换的字符数

      $var = "abcdfghicba";
      print $var."\n";   ## abcdfghicba
      $result = $var =~ tr/abc/def/; 
      print $var."\n";   ## defdfghifed
      print $result."\n";   ## 6
      print "------------------------\n";
      
    • 模式转换的特殊功能

      • 大小写转换:$str =~ tr/a-zA-Z/A-Za-z/

      • 特定字符的计数:$str =~ tr/0-9/0-9/

    • 模式转换的选项


      image.png
      $var = "123abc";
      print $var."\n";   ## 123abc
      $var =~ tr/0-9/ /c; 
      print $var."\n";   ## 123
      ​
      $var =~ tr/1b//d;
      print $var."\n";   ## 23ac
      ​
      $var = "12abc3abc";
      $var =~ tr/0-9/ /cs;
      print $var."\n";   ## 12 3
      

5、Perl正则表达式的原则

  • 原则一:

    • 正则表达式有三种不同形式,分为匹配,替换和转化
  • 原则二:

    • 正则表达式仅对标量进行匹配
  • 原则三:

    • 匹配时,默认只匹配/替换一次,且对象为最早的可能匹配
  • 原则四:

    • 正则表达式能够处理双引号所能处理的任意和全部字符
  • 原则五:

    • 正则表达式在求值过程中产生两种情况:结果状态和反向引用

    • $a =~ m/pattern/ ##产生的结果状态,布尔类型

    • $a =~ s/(word1)(word2)/$2$1/ ##产生的反向引用

  • 原则六:

    • 正则表达式的核心能力在于通配符和多重匹配运算符

    • $a =~ /\w+/ ##匹配一个或多个单词

    • $a =~ m/\d/ ##匹配0个或多个数字

  • 原则七:

    • 如果匹配不止一个字符集合,可以使用“|”来增加灵活性

    • m/(cat|dog)/ ##可以匹配cat或者dog

  • 原则八:

    • Perl中用(?...)语法给正则表达式提供扩展功能

    • (?:pattern) 匹配pattern但不获取匹配结果

    • (?=pattern) 正向预查,在任何匹配pattern的字符串开始处匹配查找字符串

    • (?!pattern) 负向预查,在任何不匹配pattern的字符串开始处匹配查找字符串

  • 说明:

    • 在Perl的模式中,括号内的子模式将存储在内存中,此功能即取消存储该括号内的匹配内容

参考来源:https://www.jikexueyuan.com/course/1441.html

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容

  • 捕获组与反向引用 在正则表达式中,圆括号的一大作用是进行模式分组,而其还有另一个非常重要的作用,即定义捕获组。捕获...
    樱雨楼阅读 1,519评论 0 0
  • 初衷:看了很多视频、文章,最后却通通忘记了,别人的知识依旧是别人的,自己却什么都没获得。此系列文章旨在加深自己的印...
    DCbryant阅读 3,896评论 0 20
  • Python中的正则表达式(re) import rere.match #从开始位置开始匹配,如果开头没有则无re...
    BigJeffWang阅读 6,931评论 0 99
  • 推荐几个正则表达式编辑器 Debuggex :https://www.debuggex.com/ PyRegex:...
    木易林1阅读 11,345评论 9 151
  • 一切可以妥当的一定会妥当,准备迎接奇迹! 感恩 中考成绩出来以及各校分数线公布好多亲朋好友都对孩子很关心,很感恩!...
    belivePossible阅读 68评论 0 0