正则表达式笔记(三)——用正则表达式处理文本

1.用s///进行替换

该操作符左边应该是某个变量,未给出默认会是$_,整个替换操作返回的是布尔值。

2.修饰符/g用来全局替换,存在即替换。如:s/\s+/ /g。

3.无损替换

s///操作完成后返回的值是布尔值(0,1),加上修饰符/r之后,会保持原字符串变量中的值不变,而把替换结果作为替换操作的返回值返回。如:my$copy = $original =~ s/\d+ ribs?/10 ribs/r。

4.大小写转换(以下规则在双引号中依然适用)

\U转义符:将其后的所有字符转换为大写

\L转义符:将其后的所有字符转换为小写

\E,关闭其后的转换功能

\l,\u只影响紧跟的那个字符

5.split根据给定的模式拆分字符串

格式:my @fields = split /分隔符/, $string;

如:my @fields = split /:/, “abc:def:g:h”;#得到(“abc”, “def”, “g”, “h”)

6.join函数把片段接合成一个字符串

如:my $result = join $glue, @pieces。如:my $x = join “:”, 4, 6, 8, 10, 12;#$x为“4:6:8:10:12”。

7.列表上下文中的m//

相当于反过来用split,模式匹配的是想要留下的部分。

my $test = “I love you”;

my @words = ($test =~ /([a-z]+)/ig);

print “Result: @words\n”;

模式中有一对圆括号则在每次匹配成功时返回对应的捕获字符串。

8.非贪婪量词

每个贪婪量词都有一个非贪婪量词,如(+)对应(+?),除了表示一次或多次,还要求能匹配的字符串越短越好。

9.跨行的模式匹配

perl中表示多行文本的写法:

$_ = “I’m much better\nthan Barneyis\nat bowling,\nWilma.\n”;

print “Found ‘wilma’ at start ofline\n” if /^wilma\b/im;

10.一次更新多个文件

#! /usr/bin/perl -w

use strict;

chomp(my $date = `date`);

$^I = “.bak”;

While(){

s/^Author:.*/Author:huangsiyuan/;

s/^Phone:.*\n//;

s/^Date:.*/Date:$date/;

print;

}

$^I的默认值是undef,赋值为某个字符串之后,可以将此字符串作为打开文件的后缀(是不是会用到文件句柄?)。具体过程:将原始文件更名为.bak文件,再创建一个与原来文件同名的文件用来接收修改过的内容。

11.从命令行直接编辑

$ perl -p -i.bak -w -e‘s/Randall/Randal/g’ fred*.dat

perl: #! /usr/bin/perl

-p: while (){

print;

}

(-n: 则没有这个print)

-i.bak: $^I = “.bak”;

-w:开启警告

-e:后面是可供执行的程序代码,放在循环中print前面

fred*.dat:命令行参数,匹配此文件名模式的所有文件名都参与进来

这一个知识点可以和上一个知识点做一下比较。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180319G1DYSJ00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

同媒体快讯

扫码关注云+社区

领取腾讯云代金券