博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
正则表达式
阅读量:4050 次
发布时间:2019-05-25

本文共 1895 字,大约阅读时间需要 6 分钟。

-- Start

如果你还不知道什么是正则表达式或者不是很清楚,请先阅读

下面是一个在 Perl 中使用正则表达式的简单例子。

#!/usr/bin/perl# qr/.../ 用来定义正则表达式# 在定义的同时,可以不指定或指定一个或多个全局匹配模式# 下面的代码构建了用来匹配固定电话号码的正则表达式, 采用不区分大小写和多行模式my $regex = qr/(\d{3}\d?)-(\d{7}\d?)/is;# 定义测试文本my $text = "我的电话号码是 0411-88888888, 欢迎骚扰。";# 采用match运算符在指定的目标字符串中查找符合正则表达式的子串if($text =~ m/$regex/) {	print "在目标字符串的$-[0]到$+[0]位置找到了$&\n"; 	print "在目标字符串的$-[1]到$+[1]位置找到了电话号码的区号$1\n";	print "在目标字符串的$-[2]到$+[2]位置找到了电话号码$2\n";} else {	print "没有找到匹配的电话号码。\n";}
  • qr/…/运算符用来定义正则表达式
  • m/.../运算符在指定的目标字符串中查找符合正则表达式的子串
  • $` 变量存储匹配之前的文本
  • $& 变量存储匹配的文本
  • $' 变量存储匹配之后的文本
  • $1 变量存储第一个捕获括号中匹配的内容
  • $n 变量存储第n个捕获括号中匹配的内容
  • $+ 变量存储编号最大的括号中匹配的文本
  • $^N 变量存储最后结束的括号中匹配的文本
  • @- 数据中存储整个匹配和捕获括号开始位置的偏移量
  • @+ 数据中存储整个匹配和捕获括号结束位置的偏移量

在构建正则表达式对象时,我们可以指定零个或多个全局匹配模式,Perl 支持如下匹配模式。

全局匹配模式 描述
/s 点号能够匹配换行符
/m ^和$可以匹配字符串内部换行符
/x 注释模式
/i 忽略大小写模式
/o 仅编译一次
/g 全局匹配

 

事实上,如果正则表达式只使用一次,我们根本就无需通过qr来定义正则表达式。此外,来列表上下文中使用match(m/.../) 操作符时,我们可以直接得到捕获型括号中的内容。

#!/usr/bin/perl# 定义测试文本my $text = "我的电话号码是 0411-88888888, 欢迎骚扰。";# 在列表上下文中使用 match 运算符my ($prefix, $suffix) = ($text =~ m/(\d{3}\d?)-(\d{7}\d?)/is);if(defined $prefix) {	print "在目标字符串的$-[1]到$+[1]位置找到了电话号码的区号$prefix\n";	print "在目标字符串的$-[2]到$+[2]位置找到了电话号码$suffix\n";} else {	print "没有找到匹配的电话号码。\n";}

 上面我们介绍了如何进行查找操作, 下面我们通过一个例子看一下如何进行替换操作。

#!/usr/bin/perl# 定义测试文本my $text = "我的电话号码是 0411-88888888, 欢迎骚扰。";# 在列表上下文中使用 match 运算符$text =~ s/(\d{3}\d?)-(\d{7}\d?)/18999999999/g;print $text;
  • substitution运算符(s/regex/replacement/modifier)用来执行替换操作.
  • regex 部分是任意的正则表达式.
  • replacement部分相当于双引号字符串,支持变量插值.
  • modifier 部分是匹配模式,除了支持上面的匹配模式外,还支持 /e
  • 如果 modifier 是/e,则replacement部分perl代码

下面我们看一个使用 /e 匹配模式的例子。

#!/usr/bin/perl# 定义测试文本my $text = "我的工资是 1000";# 在列表上下文中使用 match 运算符$text =~ s!(\d+)!$1/6.3698!e; # 转换汇率print $text;
  • substitution运算符的分隔符随意指定,上面的例子是叹号。
  • $1 为反向引用第一个括号中匹配的内容。
  • 使用 /e 匹配模式对 $1/6.3698 进行求值。

-- 更多参见:

-- 声 明:转载请注明出处

-- Last Updated on 2012-07-02
-- Written by ShangBo on 2012-06-30
-- End

你可能感兴趣的文章
Selenium-WebDriverApi接口详解
查看>>
Selenium-ActionChains Api接口详解
查看>>
Selenium-Switch与SelectApi接口详解
查看>>
Selenium-Css Selector使用方法
查看>>
Linux常用统计命令之wc
查看>>
测试必会之 Linux 三剑客之 sed
查看>>
Socket请求XML客户端程序
查看>>
Java中数字转大写货币(支持到千亿)
查看>>
Java.nio
查看>>
函数模版类模版和偏特化泛化的总结
查看>>
VMware Workstation Pro虚拟机不可用解决方法
查看>>
最简单的使用redis自带程序实现c程序远程访问redis服务
查看>>
redis学习总结-- 内部数据 字符串 链表 字典 跳跃表
查看>>
iOS 对象序列化与反序列化
查看>>
iOS 序列化与反序列化(runtime) 01
查看>>
iOS AFN 3.0版本前后区别 01
查看>>
iOS ASI和AFN有什么区别
查看>>
iOS QQ侧滑菜单(高仿)
查看>>
iOS 扫一扫功能开发
查看>>
iOS app之间的跳转以及传参数
查看>>