本文共 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";}
在构建正则表达式对象时,我们可以指定零个或多个全局匹配模式,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;
下面我们看一个使用 /e 匹配模式的例子。
#!/usr/bin/perl# 定义测试文本my $text = "我的工资是 1000";# 在列表上下文中使用 match 运算符$text =~ s!(\d+)!$1/6.3698!e; # 转换汇率print $text;
-- 更多参见:
-- 声 明:转载请注明出处
-- Last Updated on 2012-07-02 -- Written by ShangBo on 2012-06-30 -- End