9,以正则表达处理文本(perl笔记)

1, 以s///进行替换
如果把m//模式匹配操作符想成文字处理器的查找功能,那么“查找与替换”的功能就是perl的s///替换操作符。
$_ = "He's out bowling with barney tonight.";
s/Barney/Fred/; #用Fred替换Barney
print "$_ ";如果匹配失败,则什么事都不会发生,变量也不受影响。
s///会返回有用的布尔值。它在替换成功时为“真”,否则为“假”

2,以/g进行全局替换
一个场景的全局替换是缩减空白,也就是将任何连续的空白转换为单一空格
$_ = "Input data may have extra whitespace.";
s/s+/ /g;

3,不同的定界符
对于一般没有左右之分的字符,用法便跟使用斜线一样,只用3个定界符即可
s#^https://#http://#;
如果有左右之分的成对字符,就必须使用两对,一对包住模式,一对包住替换自发串,包住字符串和模式的定界符号簿需要相同
s{fred}{barney};
s[fred}(barney);
s#barney#;

4,选项修饰符
不仅是/g修饰符,替换运行也可以使用我们在一般模式中看到的/i与/s修饰符。修饰符的顺序对结果没有任何影响。

5,绑定操作符
就像在说明m//时提到的,我们也可以用绑定操作符为s///选择不同的目标


6,大小写转换
U转义字符会将其后的所有字符转换成大写
$_ = "I saw Barney with Fred.";
s/(fred|barney)/U$1/gi; #$_ 现在是"I saw BARNEY with FRED."
L转义字符会将其后的字符转换成小写
s/(fred|barney)/L$1/gi; #$_ 现在是"I saw barney with fred."

可以使用E关闭大小写转换功能
s/(w+) with (w+)/U$2E with $1/i; #$_ 现在是“I saw FRED with barney."

使用小写形式(l与u)时,它们只会影响之后的第一个字符
s/(fred|barney)/u$1/ig; #$_ 现在是" I saw FRED with Barney."

使用u与L来表示"全部转换为小写,但首字母大写"
s/(fred|barney)/uL$1/ig; #$_ 现在是“I saw Fred with Barney."

这里介绍的是替换大小写的转换,但他们也适用于任何双引号内的字符串
print "Hello, Lu$nameE, would you like to play a game? ";

7, split操作符
它会根据分割符(separator)拆开一个字符串。这对处理制表符,冒号,空白或任意符号分割的数据相当有用
@fields = split /separator/, $string;
例如:
@fields = split /:/, "abc:def:g:h"; #产生("abc","def","g","h")
利用/s+/模式以空白进行分割也是常见的做法,在此模式下,所有的空白会被当成一个空格来处理
my $some_input = "This is a test. ";
my @args = split /s+/, $some_input; #("This","is","a","test.")
split默认会以空白字符拆开$_:
my @fields = split; #等于 split /s+/, $_;

8, join函数
split会将自费串分解为整个片断(子字符串),而join则会把这些片断联合成一个字符串。它的用法如下所示:
my $result = join $glue, @pieces;
例如:
my $x = join ":" 4,6,8,10,12; # $x 为 "4:6:8:10:12"

9, 列表上下文中的m//
$_ = "Hello there, neighbor!";
my($firse,$second,$third) = /(s+) (s+), (s+)/;
print "$sencond is my $third ";

之前在s///的例子中所看到的/g修饰符,同样也可以用在m//操作符上,其效果就是让模式能够匹配到字符串中的许多地方。下面的例子中

具有一对圆括号的模式,会在每次匹配成功是返回一个记忆:
my $text = "Fred droped a 5 ton granite block on Mr. Slate";
my @words = ($text =~ /([a-z]+)/ig);
print "Result:@words ";
# Result: Fred dropped a ton granite block on Mr Slate

如果里面不仅仅是一对圆括号,那么每次匹配成功,就可能返回一个以上的字符串,假设,我们想把一个字符串变成散列,就可以这样做:
my $date = "Barney Rubble Fred Flintstone Wilma Flintstone";
my %last_name = ($sdata =~ /(w+)S+(w+)/g);


10, 非贪心量词
/fred.+?barney/

11, 跨行的模式匹配
传统的正则表达式都是用来匹配单行文本。由于perl可以处理任意长度的字符串。其模式匹配也可以处理多行稳步,与处理单行稳步并无

差异。
$_ = "I'm much better than Barney is at bowling, Wilma. ";
^与$这两个锚点原本代表整个字符串的头跟尾。当模式加上/m修饰符后,就可以让他们也代表换行符号。这样一来,他们所代表的就不在

是整个字符串的头尾,而是每行的开头跟结尾。
print "Fonud 'wilma' at start of line " if /^wilma /im;

11,一次更新多个文件
#!/usr/bin/perl -w

use strict;

chomp(my $sdate = `date`);
$^I = ".bak";

while (<>) {
s/^Author:.*/Author: Randal L. Schwartz/;
s/^Phone:.* //;
s/^Date:.*/Date:$date/;
print;
}

# $^I 先把文件做一个备份

12,不具记忆功能的圆括号

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/312079/viewspace-245694/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/312079/viewspace-245694/

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值