1.使用正则表达式替换文本  s///

   s/<pattern>;/<replacement>;/ 如果匹配失败, 则什么也不会发生, 变量也不受影响. 返回布尔值, 替换成功时为真, 否则为假.

$roger = "This is a text";
$roger =~ s/This (\w+)/This was/;
print $roger;
$_ = "green scaly dinosaur";
s/(\w+) (\w+)/$, $/; print; printf("\n"); #scaly, green dinosaur
s/^/huge, /;print; printf("\n"); #huge, scaly, green dinosaur
s/,.*een//;print; printf("\n"); #huge dinosaur
s/green/red/; print; printf("\n"); #失败, 不会变
s/\w+$/($`!)$&/;print; printf("\n"); #huge (huge !)dinosaur
s/\s+(!\W+)/$ /;print; printf("\n"); #huge (huge!) dinosaur
s/huge/gigantic/;print; printf("\n"); #gigantic (huge!) dinosaur

  更换定界符: 无左右之分的字符(非成对),重复3次即可, 否则用2对, 一对圈引模式,一对圈引替换字符串.  圈引字符串定界符合圈引替换定界符不必相同, 如:  s#roger#loger#;  s{roger}{loger};  s[roger](loger);  s<roger>#loger#;

2.使用/g进行全局替换

$_ = "roger, go on roger!";
s/roger/loger/g; #不重不漏替换所有匹配串
print ;

   常用技巧

$_ = "     This is a text   that don't    beatiful!   ";
s/\s+/ /g; #去掉多余的空白
print; printf("\n");
s/^\s+//; # 去掉前导空格
print; printf("\n");
s/\s+$//; # 去掉末尾空格
print; printf("\n");

  使用修饰符修改大小写:

  \U 将其位置后的所有字符转换成大写. \u 将位置后的第一个字符转换为大写

  \L 将其位置后的所有字符转换成小学, \l 将位置后的第一个字符转换成小写.

3.split操作符

  split使用正则表达式, 根据分隔符拆开一个字符串, 并返回对应的一个数组;  方便用来处理被制表符/冒号/空白/任意符号分隔的数据. 只要能将分隔符写成模式, 就可以用split提取数据.

  用法:  @fields = split /<pattern>/, $string; 如果两个分隔符连在一起, 就会产生空字段 ;  split会保留开头的所有空字段并去掉结尾处的空字段(如果想要保留, 加上第3个参数并赋值为-1即可).

  默认: 使用空白字符分割 $_  ;  相当于  split /\s+/,$_; 但不完全是, 因为它还会进一步省略开头的空字段.

4. join函数(胶水操作) -- split的逆操作

  join不使用正则表达式, 将它的第一个参数(字符串,而不是模式)作为胶水, 粘接后面其他参数(变长参数)构成的片段. 胶水只会在片段之间使用.

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

  收到split的启发, 分隔符并非真正有用的数据字段, 在列表上下文中匹配时, 如果成功匹配, 可以返回所有捕获的变量的列表, 匹配失败, 返回空列表.

$_ = "Hello there, neighbor!";
@roger = /(\S+) (\S+), (\S+)/;
print $roger[]; #there

  /g也可以用在m//上

# 将匹配的字符串按一前以后组成哈希, 如 Barney Rubble都匹配, 返回后Barney为键,Rubble为值
my $data = "Barney Rubble Fred Flintstone Wilma Flintstone";
my %last_name = ($data =~ /(\w+)\s+(\w+)/g);
print $last_name{Wilma}."\n";

6.非贪婪量词

  目前掌握的所有量词都是贪婪的, 会尽量匹配多的字符, 如果不满足才返回匹配少的 , 如  .* , 如果要使用非贪婪的量词,可以在量词后面加上一个 ? , 所以非贪婪量词就有以下这些:  +?  *?  ??  {m,n}?

7.跨行的模式匹配

  一般而言,Perl中的正则表达式用来匹配单行文本,  由于Perl可以处理任意长度的字符串,  所以一般没什么问题. 现在讨论处理多行文本.

  表示多行文本: 在一个字符串中加上\n就表示多行文本, 但是匹配字符串首尾时并不会在意\n的存在, 因为 ^ 和 $ 匹配的是整个字符串的首尾. 要想考虑到\n的存在, 将字符串当做多行文本来处理, 就需要在模式后面加上  /m  ,表示(multiple lines), 此时, ^ 和 $ 就表示匹配一样的首和尾.

open MYFILE, ">> a.txt" or die "Can't open file!\n";
$_ = "I'm much better\nthan Barney is\nat bowling,\nWilma.\n";
if(/^I'm.*?better$/m){
print MYFILE $&."\n"; #I'm much better
}
close MYFILE;

8.一次更新多个文件

  获取本地时间,  $date = localtime; 这个可以获取标准时间字符串, 如果直接打印localtime, 将得到时间戳. 也可以用系统的date命令,  $date = `date`

  在Perl中进行文件修改可以使用钻石操作符和特殊的变量  $^I

chomp(my $date = localtime);
$^I = ".bak"; #这个变量的默认值为undef, 当被赋值为某个字符串时, 钻石操作符就会将自动打开的文件进行备份,后缀名加上变量的内容,需要注意的是如果这个变量为空, 就会直接修改原文件,数据可能会丢失
while(<>){
s/^Author:.*/Author: Roger/; #在这里对文件内容进行修改
# 将文本替换后输出到目标文件, 没有修改过的内容会被保留
print; #输出到对应的文件中, 可以认为是由钻石操作符来维护
}

9.命令行在线编辑 -- 对上一条的再简化

  命令行中:  $ perl -p -i.bak -w -e 's/Author:Roger.*/Author:Roger/g' a*.dat , 功能和上面相同.

  -p 表示生成一段代码  while(<>){print;}

  -i.bak 表示给变量 $^I赋值为 ".bak"

  -w 表示打开警告

  -e 表示有多条语句, 最后一条可省略分号;

Perl 学习笔记-正则表达式处理文本的更多相关文章

  1. perl学习笔记——正则表达式

    正则表达式 简单模式:匹配$_中的内容,只需要将模式写在一对斜线(/)中就可以了. 如:#!/usr/bin/env perl use 5.010; $_="yabba dabba doo& ...

  2. PERL学习笔记---正则表达式的应用

    使用m//匹配 //这是m//(模式匹配)的一种简写.同qw//操作一样,可以使用任何成对的分隔符.因此,可以使用m(fred), m<fred>, m{fred}, m[fred],或者 ...

  3. PERL学习笔记---正则表达式

    要匹配某个模式(正则表达式)和$_的关系,可以将模式放在正斜线(//)之间,如下:$_ =“yabba dabba doo”;if(/abba/){print “It matched!\n”;} 表达 ...

  4. CSS学习笔记:溢出文本省略(text-overflow)

    原文:CSS学习笔记:溢出文本省略(text-overflow) 在CSS3中,text-overflow属性的基本语法如下: clip:表示不显示省略文本,简单的裁切. ellipsis:表示对象文 ...

  5. Perl 学习笔记-正则表达式基础篇

    1.Perl中的正则表达式 在Perl中叫做模式, 是一个匹配(或不匹配)某字符串的模板, 是一种小程序, 对于一个字符串, 要么匹配, 要么不匹配. 使用简易模式: 将模式写在一对正斜线(/)中即可 ...

  6. perl学习笔记之:正则表达式

     Perl 中的正则表达式 正则表达式的三种形式  正则表达式中的常用模式  正则表达式的 8 大原则          正则表达式是 Perl 语言的一大特色,也是 Perl 程序中的一点难点,不过 ...

  7. [Python学习笔记]正则表达式总结

    常用缩写字符及其含义表格查询 缩写字符分类 含义 \d 0-9的任意数字 \D 除0-9的数字以外的任何字符 \w 任何字母.数字或下划线字符(可以认为是匹配"单词"字符) \W ...

  8. 小菜鸡的学习笔记---<正则表达式(1)>

    正则表达式学习笔记(1) (纯新手学习笔记,大佬绕路 QAQ) 一.简介 正则表达式就是一种文本模式用来匹配一系列满足特定条件的字符串,可以对比一下数学里面的表达式,比如我们要用一个表达式表示一串数字 ...

  9. perl学习笔记之:模式匹配,模块,文档

    Perl语言的最大特点,也是Perl作为CGI首选语言的最大特点,是它的模式匹配操作符.Perl语言的强大的文本处理能力正是通过其内嵌的对模式匹配的支持体现的.模式通过创建正则表达式实现.Perl的正 ...

随机推荐

  1. python 数组的操作--统计某个元素在列表中出现的次数

    list.count(obj)  统计某个元素在列表中出现的次数例子: aList = [123, 'xyz', 'zara', 'abc', 123]; print "Count for ...

  2. java代码---实现随机产生1000个随机数,并10个一行的输出

    总结:不会用,就是不熟 package com.s.x; //输入10个随机数,并显示最大值,最小值 import java.util.*; public class Value { public s ...

  3. 判断和调整library cache,data dictionary cache,buffer cache性能

    Oracle SGA是oracle的内存结构,存放着oracle通过oracle进程读写的内存数据.sga分为好多组件,比如shared pool,buffer cache,redo log buff ...

  4. 用户从手机的浏览器访问www.baidu.com,看到的可能跟桌面PC电脑,是不太一样的网页效果,会更适合移动设备使用。请简要分析一下,实现这种网页区分显示的原因及技术原理。

    手机的网速问题.屏幕大小.内存.CPU等.通过不同设备的特征,实现不同的网页展现或输出效果.根据useragent.屏幕大小信息.IP.网速.css media Query等原理,实现前端或后端的特征 ...

  5. eclipse 使用lombok 精简java bean

    前言:             lombok 提供了简单的注解的形式来帮助我们简化消除一些必须有但显得很臃肿的 java 代码.特别是相对于 POJO             lombok 的官方网址 ...

  6. Microsoft.Office.Core 引用以及 Microsoft.Office.Core.MsoTriState 的问题

    转自原文 xiaoanian, Microsoft.Office.Core 引用以及 Microsoft.Office.Core.MsoTriState 的问题 因为要做一个提取ppt文字的工程,第一 ...

  7. 「小程序JAVA实战」小程序头像图片上传(下)(45)

    转自:https://idig8.com/2018/09/09/xiaochengxujavashizhanxiaochengxutouxiangtupianshangchuan44/ 接下来,我们应 ...

  8. Maven父级pom.xml配置文件

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...

  9. vertex shader(4)

    Swizzling and Masking 如果你使用输入.常量.临时寄存器作为源寄存器,你可以彼此独立地swizzle .x,.y,.z,.w值.如果你使用输出.临时寄存器作为目标寄存器,你可以把. ...

  10. 读取resource下文件

    ArrayList<PatrolOper> patrolOpers = new ArrayList<>(); String jsonData = null; File json ...