Perl学习笔记(6)-- 正则表达式

时间:2021-02-14 05:38:16

正则表达式

  • 组号 在正则表达式中用()可以对匹配内容进行分组,并且可以用\1,\2之类的来引用所匹配的组。新的perl还支持\g{N}的方式应用匹配的组号
  • 选择匹配,用|可以选择匹配左边或右边, /fred|barrey|betty/
  • 字符集合,用[]可以描述待匹配的字符的集合比如[abcdef12345]字符集合,也有些字符集合的简写形式如\w表示[A-Za-z],\d表示[0-9],还有\s表示所有空白符,\S表示非空白字符。 字符集合的反向集合,表示除字符集外的其他所有字符集合。[^\d]
  • 匹配符/ /是m/ /的简写,当显示用m//时,/可以替换成别的成对的符号,类似qw()。
    • 符号/i修饰符表示进行大小写无关的匹配,/s表示匹配任意字符,包括换行符。
  • 瞄位,行瞄位^,$,词瞄位\b,词瞄位只匹配\w+的字符串。
  • 邦定符~=, //默认用$_进行匹配,通过邦定符~=可以指定要匹配的字符串$line ~= /$what pattern/x $what可以是带双引号的内插字符串变量。匹配后的捕获变量\1,\2之类的 有生命周期。捕获变量的生命周期从此次匹配成功开始,到下次匹配成功后被重置,失败的匹配不会被替换。安全做法匹配后将捕获变量重新赋值给新的变量。
    • my $names = "fred or barney"; 
      if ($names ~= m/(\w+) (or|and) (\w+)/)
      { say "I saw $1,$2";} #错,应该是$1,$3}
      如果觉得$1,$2这样的名字很费劲可以这么写
      if ($names ~= m/?<$name1>(\w+) (?:or|and) (?<$name2>\w+)/)
      { say "I saw $name1, $name2";} #这是命名的捕获变量
  • 通用量词,可以用+表示大于等于1个,*表示大于0次,?表示0或1次。而通过{,}指定指定重复次数,比如+可以用{1,}表示,?用{0,1}
  • 替换s/pattern/replacement/ ,默认是对匹配的第一个进行替换,如果加上/g可以进行全局替换,即匹配所有进行替换。
    • s/ / /和m// ,qw//一样用不同的界定符代替/ 
    • 大小写替换,在替换过程中可以通过\U,\L对其后面修饰的所有字符串进行大小写的转换,也可以用\E结束大小写转换。当然\u,\l可以对后面的一个字符进行大小转换。
  • split 根据分割符拆分一个字符串为列表。@friends = splite/,/,"larrey,fred,banery"; split默认一空白分割$_,所以未指定要分割的字符串或分割符的时候,就要知道干嘛哦。
  • join是split的相反功能的函数,将列表用指定的字符连接起来。join又叫胶水函数,用胶水把碎片沾起来。$result = join $glue,@pices;
  • 列表上下文环境中的匹配m// ,如果匹配成功返回所有捕获变量的列表,否则返回空列表
    • $_ = "hello there, neighbor"
      my($first, $second, $third) = /(\S+) (\S+) (\S+)/;
      还可以将匹配的结果变成hash
      my $data = "Barney Jimy Fred Larry Wilam Filance"
      my $last_name = ($data ~= /(\w+) (\w+)/gi
  • 贪婪量词和非贪婪的量词。像*,+直接使用的时候一般使用贪婪的方法尽量匹配多的后序字符,而有时候希望非贪婪的匹配,这时候在*,+后用?修饰,比如*?,.*。
  • 批量更新文件,在用钻石符<>对命令行参数对应的文件进行处理(不如替换,删除)时,如果有多个文件处理,如果我们希望处理前进行备份,而这个备份的后缀可以通过修改变量$^I的值。在$^I为空时,表示直接处理,不备份。
  • 通过perl命令直接处理文件。perl -p -i.bak -w -e "s/\bRandall\b/\bRandal\b/g/" *.txt 
    -p表示对每一行处理 -i.bak修改前将原文件备份以.bak为原文件新后缀,-w打开警告,-e指示所要执行的命令。