perl 模式匹配修饰符 /m /s 使用说明

在使用perl的正则表达式中,可以使用m,s等修饰,具体含义通过实例更好理解。

#!/usr/bin/perl -w
use strict;
use warnings;

my $file;
$file = "32'h5a5a_5a5a;\ncity (shanghai beijng\nbelong to China)eeffdd\nlog\n111111111222222222\n";

print $file;
# 执行print $file后得到:
# 32'h5a5a_5a5a;
# city (shanghai beijing
# aabbccdd)eeffdd
# lgo
# 111111111222222222
$file =~ /city(.*)log/;
print $1;
#此处没有模式匹配上,因为 ‘.’ 并不能匹配‘\n'换行符。

$file =~ /city(.*)log/s;
print $1;
# 加上 s 后,可以让  ‘.’ 匹配换行符,这就是它的作用。
# 打印得出:
#  (shanghai beijng
# belong to China)eeffdd
$file =~ /^city(.*)$/;
print $1;
# 此时没有模式匹配上,因为 ‘^’代表行首,$file的行首后面紧挨着的是‘32’

$file =~ /^city(.*)$/m;
print $1;
# 加上 m 后,成为多行模式,即将$file 根据 ‘\n’ 来划分每行,一共5行。‘^city’匹配第二行开头
# 打印得出:
#  (shanghai beijing
# 注意 beijing后面并没有换行符, 因为没有加上 s , ‘.’无法匹配换行符
# 如果加上 s 会是什么打印效果呢?

$file =~ /^city(.*)$/sm;
print $1;
# 加上 s 后打印效果如下,此时因为 ‘.’ 可以匹配换行符,同时模式匹配默认的是贪婪模式,直接匹配到了最后一行的结尾‘$', 而不是第二行的‘$’;
# 打印结果如下:
#  (shanghai beijng
# belong to China)eeffdd
# log
# 111111111222222222

$file =~ /^city(.*?)$/sm;
print $1;
# 如果在 * 后面加上 ?, 启用非贪婪模式,则只匹配到第二行结尾‘$'.
# 打印结果如下:(此时虽然加了 s , beijing后面也没有换行符,因为是非贪婪模式
#  (shanghai beijing

‘$'代表的行尾,其实它在有换行符的时候匹配"\n",而不是"\n"的前、后,在没有换行符的时候,匹配行尾。

# 那么我们一般在什么时候会用到 修饰符 m 呢, 比如想匹配 一个 ( ),但是跨行了,此时可以 m s 搭配使用

$file =~ /city(.*)ee/ms;
print $1;

# 打印结果:得到 ( ) 内的内容
#  (shanghai beijng
# belong to China)

 

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值