第9章 用正则表达式处理文本
2020-03-08 本文已影响0人
Hannahhao
1. 用s///进行替换操作
s///替换操作符:substitution,查找并替换功能。把存在变量中的匹配模式的那部分内容替换成另一个字符。
- 用/g进行全局替换
- 不同的定界符
s///的定界符和m//、qw//一样,只要重复三次即可。
如果有左右之分,就必须使用两对:一对包住模式,一对包住替换字符串。
s{fred}{barney};
- 替换操作的修饰符
/i, /x, /s 都可以用
- 绑定操作符
=~ 为绑定操作符
- 非破坏性替换
如果需要同时保留原始字符串和替换后的字符串怎么办?
先复制一份拷贝后再替换
my $original = "Fred ATE 1 RIB";
my $copy=$original;
$copy =~ s/\d+ ribs?/10 ribs/;
或者
my $copy=$original =~ s/\d+ ribs?/10 ribs/r;
/r:保留原来字符串变量中的值不变,而把替换结果作为替换操作的返回值返回。
- 大小写转换
\U转义符:将其后的所有字符转换成大写的
\L转义符:将其后的所有字符转换成小写的
\E:关闭大小写转换的功能
- 元字符转义
\Q:会把后续字符串中的所有元字符自动转义为本意字符。
2. split 操作符
split操作符:给定模式拆分字符串为一组列表。
my @fields = split / separator/, $string;
3. join函数
join函数:把片段连接成一个字符串。
my $result = join $glue, @pieces;
4. 列表上下文中的m//
5. 更强大的正则表达式
- 非贪婪量词
贪婪量词:按照左起最长原则尽可能地多匹配文本
非贪婪量词:越短越好。加一个问号“?”,就会在第一次找到合适的位置时结束。
元字符 | 意义 |
---|---|
?? | 匹配零个字符(没用) |
*? | 零个或多个,越短越好 |
+? | 一个或多个,越多越好 |
{3,}? | 至少3个,越短越好 |
{3,5}? | 至少3个,最多5个,越短越好 |
{3}? | 正好3个 |
- 更为别致的单词边界符
\b{wb}:它会觉得单引号后的t不是独立单词,应该和之前的部分一起成为一个单词
\b{sb}:推断某个标点符号是句子的末尾。
- 跨行模式匹配
传统的正则表达式都是匹配单行文本。但也可以处理多行文本。
- 一次更新多个文件
- 从命令行直接替换文件内容
perl -p -i.bak -w -e 's/randall/Randa/g' fred*.dat
-p #自动生成小程序
while (<>) {
print;
}
-w #警告
-i.bak #备份
- e # 后面跟的是可供执行的程序源代码
s/Randall/Randal/g #会被直接当初Perl程序代码