Perl语言程序设计_正则表达式

本文介绍了Perl语言中的正则表达式,包括匹配操作符m//,替换操作符s///和转化操作符tr///,并详细阐述了/i、/s、/x等修饰符的作用,如大小写无关匹配、任意字符匹配和添加空白符以提高代码可读性。此外,还讨论了锚位如A、z和在文本定位中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Perl语言之所以是一种非常擅长文本处理的语言,我想很多都是由于正则表达式的缘故。Perl语言中的正则表达式功能基本是所有常用语言中最强大的,以至于很多语言设计正则表达式支持的时候都参考Perl语言的正则表达式。正则表达式描述的是一种匹配模式,换言之就是可以快速判断目标字符串是否与我们提供的模板匹配,或者快速判断目标字符串中是否含有与我们的模板匹配的部分。除了检查是否匹配之外,正则表达式还支持替换、转化等操作。概括而言,Perl的正则表达式有三种形式:

  • 匹配:m//(还可以缩写为//)
  • 替换:s///
  • 转化:tr///

这三种形式一般都和=~(表示匹配)或者!~(表示不匹配)搭配使用。它们不仅在语法上更为简洁,还可以像双引号字符串一样解析,而不是作为普通的操作符。

匹配操作符

匹配操作符顾名思义就是用于匹配一个字符串语句的表达式,即m//,也可以直接缩写成//。需要进行匹配的字符串模板写在两个斜线中间。例如:

#!/usr/bin/perl

$text = "beforematchafter";#目标字符串
if ($text =~ /match/)#检查目标字符串中是否有match这个字符串
    print "Matched";
else
    print "No match";

实际上,这对斜线就是一组定界符。言外之意,我们可以用任意别的定界符替换双斜线,例如m(match)、m{match}等等都是可以的。当然,选择模式中不会出现的字符作为定界符才是明智的选择。我们可以默认用斜线作为定界符,当模式中存在斜线的时候,比如说去匹配网址的时候,我们再临时使用一下别的定界符,这样可以有效避免代码出错。

Perl语言中存在好几个模式匹配修饰符,也成为标志。它们是追加在模式表达式的定界符后面的字符,用来改变默认的匹配行为。

用/i进行大小写无关的匹配

如果模式表达式后面加上小写字母i,则匹配过程中程序会完全无视大小写之间的区别。举例而言,YES、yes、Yes等等在这里是完全等价的。

用/s匹配任意字符

默认的情况下,点号“.”无法匹配换行符,这在绝大多数情况下都是很合理的。但是个别时候,如果我们希望点号可以匹配换行符,那么我们可以在模式表达式后面加上s。它会将模式中的每个点号转换成按字符集[\d\D]进行处理。

用/x加入空白符

有时候我们的模式表达式写出来会显得很凌乱,如果我们可以在其中加入空格进行分割、对齐的话可以使得代码更为易读。但是随意的添加空格又会导致匹配失败。在模式表达式的后面加上x就可以解决这个问题。它会使程序在匹配的过程中忽略模式表达式中的空格。

组合选项修饰符

当一次匹配需要用到上述的多个特性的时候,我们可以将对应的标志全部加到模式表达式的后面,而不用在乎它的顺序。

锚位

默认的情况下,给定的模式如果不匹配字符串的开头,就会从下一个字符继续尝试,通过给定锚位,我们能够让模式仅仅在字符串的指定位置匹配。

\A锚位匹配字符串的绝对开头。例如我们想检查某个网址是不是https开头的就可以使用这个锚位;\z匹配字符串的绝对末尾,例如我们想检查文件名的后缀是不是.jpeg,就可以使用这个锚位。\b是单词边界锚位,它匹配任何单词的首尾。不过,这里的单词不是指一般的英文单词,而是一组\w字符构成的字符集,即可以是英文字母,也可以是数字和下划线。

替换操作符

替换操作符是匹配操作符的一个扩展,其作用是,如果成功匹配,就将匹配的部分替换为另一个字符串。基本格式如下:

s/PATTERN/REPLACEMENT/;

PATTERN为匹配模式,REPLACEMENT为替换的字符串。

和匹配操作符相同,替换操作符也有一些可以使用的标志:

替换操作符标志
修饰符描述
i如果在修饰符中加上“i”,则正则表达式会取消大小写敏感性。
m默认的正则开始“^”和结束“$”只是对于正则字符串。如果在修饰符中加上“m”,那么开始和结束将会指字符串的每一行。
o表达式只执行一次。
s“.”将会代表任意字符。
x表达式中的空白字符将会被忽略,除非它已经被转义。
g替换所有匹配的字符串。
e替换字符串作为表达式。

转化操作符

以下是转化操作符相关的修饰符

转化操作符标志
修饰符描述
c转化所有未指定字符
d删除所有指定字符
s把多个相同的输出字符缩成一个

举例而言,我们打算将一个变量中所有的小写字母都变成大写字母:

#! /usr/bin/perl

$string = 'We want to change this sentence.';
$string =~ tr/a-z/A-Z/;
print "$string\n";

执行以上程序的输出结果为:WE WANT TO CHANGE THIS SENTENCE.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值