当前位置: 首页 > news >正文

Perl小骆驼学习笔记 - 9. 用正则表达式处理文本

 1.查找与替换

 s/查找模式/替换/;

     (可以单独成一行,直接完成对$_中元素的查找和替换,返回值为布尔值,也就是说可以用在while或者if的条件语句中)

 2. /g完成全局替换

 s/find/replace/g

      可以对$_中所有匹配成功的变量进行替换。

      最常见的替换时减少空白符:

s/\s+//g;

      或者替换开头或者结尾的长串空白符:

s/^\s+|\s+$//g;

3. 定界符的使用

    和m//,qw//一样,s///定界符也可以是多样的,   但是对于成对出现的符号{},[]写法略有不同;

    s{}{};另外前后定界符也可以不一致:s{}[];

4. 可用的替换修饰符

     除了/g外,还可以采用/i 不区分大小写;/s 匹配任何字符,/x 可以加任意空白符。

5. 绑定操作符

    可以自行给s///制定目标了:

    $name =~ s///;

6. 大小写转换

    \U转义符可以将他后面的字符全变成大写;

    \L将其后全变成小写;

    \u,\l只改变紧邻的值得大小写;

    可以配合使用:

    比如:\u\L:将其后小写,但首字母大写;

7. split操作符

     根据所给出的模式来拆分字符串:

my @array = split /匹配模式 /, $strings;

    注:

        1. 拆分之后是给数组@array

        2. my @array = spilt;表示去除开头空字段

        3. split一般会保留开头空字段,但是会丢弃结尾的空字段

        4. 匹配模式内不要加(),若要加采用(?:)非捕获写法

        5. 拆分之后相当与数组有了两个部分:模式前内容和模式后内容

8. join函数

    join在功能上来看是split的反向应用:

   my $something = join $glue, @pieces;

    $glue 表示一个字符串,

    @pieces 可以是一个元素大于2的数组,或者是系列由,隔开的字符串/字符;

    @pieces:元素必须大于2,不然就会返回空。

    一般讲join和split进行联合使用:

my @value = split /:/,  "4:6:8:10";my $z = join "-", @value;

    $z是4-6-8-10;

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

    分别捕获数据:

    $_= "......";

   my ($A,$B,$C) = /()()()/;捕获的内容放在三个变量里,比前面说的给捕获前面加:?<>,简单一点。

  其次,

   my @array = (my $name = ~ //);把匹配的内容给一个数组;

   my %array = (my $name =~ / ()\s+())/;每次取两个内容作为哈希的键和值;

10.更加强大的正则表达式

    1. 非贪婪量词

    贪婪量词:+,*,?,{n,m};

    非贪婪量词 ’:‘

    贪婪量词 ’?‘;

1. 工作机制有区别

   区别:在替换数据时候会产生差异: 

$_ = <ooo>wilma</ooo>, and <ooo>hahah</ooo>;s#<ooo>(.*)</ooo>#$1#g;

  贪婪量词:会留下wilma</ooo>, and <ooo>hahah

s#<ooo>(.*?)</ooo>#$1#g;

  非贪婪:wilma, and hahah

2. 跨行的模式匹配

  ^,$ 配合/m时表示每一行的行首和行尾;

  我们可以利用^,$确定行首和行尾进行匹配;

  ex.  

open FILE ,$filename or die " open failled";my $lines = join ' ', <FILE>;$line =~ s/^/begin:/mi;

   在句柄文件指示的文件里的行首加入 begin:

3. 一次更新多个文件

 #!/usr/bin/perluse 5.010;use strict;$^I=".bak"; #表示处理过程中的备份文件后缀,如果不要备份,写成空字符也可以。while(<>){s/^(.*)abc(.*)/ABC/m;print;}

    可以完成一系列文件的修改,原文件被备份在.bak中;

  4.从命令行直接编辑

perl -p -i.bak -w -e 's/a/b/g'  fred*.dat;

   perl  相当于#!/usr/bin/perl

   -p:生成一个while(<>){print;}

   (-n:生成while(<>){})

   -i.bak: 备份,扩展名为.bak

   -w: warning

   -e:后面时可执行程序

   '...':执行的内容;

  fred*dat:访问的文件名。

总结

本节描述在文本的上下文高效实现匹配的一些方式,在处理文本机制时较为常用。至此,模式匹配的部分基本完成了,后续在实际的使用中,需要彼此的结合使用才能更好的发挥对应的能力。

http://www.dtcms.com/a/277274.html

相关文章:

  • 香港服务器Python自动化巡检脚本开发与邮件告警集成
  • 《雨下小暑》诗赏——小暑时节暴雨之晨的清凉视听(智普清言)
  • iOS UI视图面试相关
  • 从儿童涂鸦到想象力视频:AI如何重塑“亲子创作”市场?
  • [特殊字符]使用 Nginx 将 HTTP 重定向到 HTTPS
  • Anaconda3安装教程(Windows)
  • 低代码引擎核心技术:OneCode常用动作事件速查手册及注解驱动开发详解
  • Web应用性能优化之数据库查询实战指南
  • 楼宇自动化:Modbus 在暖通空调(HVAC)中的节能控制(二)
  • 【Linux系统与网络编程】06:进程间通信
  • Day 19: 标准库巡礼:Python的“百宝箱”
  • c++学习之---红黑树的实现
  • CentOS 7 升级系统内核级库 glibc 2.40 完整教程
  • MSVCP*.dll、vcruntime*.dll缺失或损坏,以及.NET Framework相关问题,解决办法
  • 移动端设备本地部署大语言模型(LLM)
  • 【论文阅读】基于注意力机制的冥想脑电分类识别研究(2025)
  • LabVIEW智能避障小车
  • C/C++数据结构之多维数组
  • vue3 el-select默认选中
  • Java_Springboot技术框架讲解部分(二)
  • 【Linux内核模块】模块加载函数--从启动到运行的幕后推手
  • MySQL 分表功能应用场景实现全方位详解与示例
  • 算法学习笔记:19.牛顿迭代法——从原理到实战,涵盖 LeetCode 与考研 408 例题
  • 先“跨栏”再上车 公交站台装70厘米高护栏 公司回应
  • Mock 数据的生成与使用全景详解
  • 知识蒸馏:模型压缩与知识迁移的核心引擎
  • 通过同态加密实现可编程隐私和链上合规
  • GraphRAG:融合知识图谱与RAG的下一代信息检索框架
  • 【RK3568 平台I2C协议与AGS10驱动开发】
  • 深度学习16(对抗生成网络:GAN+自动编码器)