14. Perl 正则表达式-正则匹配
正则表达式(regular expression) 在Perl 里面通常也叫模式(Pattern). 正则表达式是用来匹配或不匹配某个字符串是否符合特定字符串模板的,也可以实现字符串的替换.
1. 正则匹配语法
Perl 的正则表达式语法非常灵活, 可以借助于内置变量$_ 进行简化, 也可以借助于m符号来自定义匹配定界符.
1.1 简写方式
- 简写模式使用内置变量$_与模式进行匹配.
- 标准模式无须使用绑定操作符 =~
# 匹配字符串
$_ = "hello,world";
if(/ll/){print "it matched!\n";
}# 匹配数组
@books=("java", "javascript", "linux", "unix");
foreach (@books){print "$_ matched!\n" if(/java/);
}
1.2 标准方式
- 标准模式需要使用绑定操作符 =~
foreach my $book (@books){if($book =~ /i.*x/){print "$book matched!\n";}
}
1.3自定义模式定界符
- 当匹配模式中包含多个/ 时, 由不想借助转移字符\时, 可以使用自定义模式定界符
- 自定义定界符时, 需要使用m
- 常用的模式定界符有大括号{}
# 简写模式
$_="https://baidu.com";
print "$_ matched!\n" if(m{https://});# 标准模式
@webs=("https://baidu.com", "https://taobao.com", "http://jd.com", "http://tianmao.com");
foreach my $web (@webs){if($web =~ m{https://}) {print "$web\n";}
}
2. 正则模式中的元字符
所谓元字符,就是指在正则表达式中具有特殊含义的字符。当元字符想表示其本身时, 需要借助于反义字符.
元字符 | 含义 | 实例 |
---|---|---|
. | 匹配任意字符 | a.b, 可匹配aab, abb, 不匹配ab, accb |
* | 标识前面字符出现0~n次 | ab*d, 可匹配ad, abd, abbd, 不可匹配aed |
+ | 标识签名字符出现1~n次 | ab+d, 可匹配abc, abbd, 但不可匹配ad, aed |
() | 模式分组, 可对模式进行组合多次匹配 | a(bc)+d, 可匹配abcd, abcbcd 等 |
| | 表示或, 笔者通常会与() 组合使用 | a(b |
[] | 匹配[]中的任一一个字符 | a[bce]d, 只可匹配abd, acd, aed |
[] 中的- | 与[] 配合使用, 属于[]对连续字符的简写模式 | a[1-3]b, 只匹配a1b, a2b, a3b |
[] 中的^ | 表示[]匹配的反义, 即不匹配[]中的任意字符 | [^0-9], 匹配非数字 |
\ | 反义字符,取消元字符的反义 | a\.b, 匹配a.b |
\n | 引用捕获组, n 为数字1, 2, 3… | ([a-d])([0-9]-\2\1, 匹配a0-0a, b2-2b 等 |
\g{n} | 引用捕获组, n为数字, 可为负数 …,-2,-1,0,1,2… | (a-d)(0-9)-\g{-1}\g{1}, 匹配a0-0a, b2-2b 等 |
3. 模式修饰符
模式修饰符可以组合,不分先后.
修饰符 | 含义 | 示例 |
---|---|---|
i | 忽略大小写 | /ab/s, 可匹配ab,AB, Ab, aB |
s | 默认元字符.无法匹配换行符\n, 添加s修饰后可匹配换行符 | /a.b/s,可匹配aab, a\nb |
x | 允许模式中添加空白符 | 可在模式中任何位置添加任意多个空白符,增加模式的可读性. 但是需要注意的是,匹配空白符需要使用\s |
a | 使用ASCII 匹配 | |
u | 使用Unicode 匹配 |
4. 锚位
- 默认情况下, 如果字符串的开头不匹配给定的模式, 那么会瞬移至第二个字符尝试, 直到字符串的最后一字符。
- 通过锚位,我们可以指定字符串从哪儿开始匹配.
- perl5 对于行首和行位有了新的表示方式, 但是常用的还是 ^和$
锚点符号 | 含义 |
---|---|
^ | 匹配行首, perl4 表示方式 |
$ | 匹配行尾, perl4 表示方式 |
\A | 字符串绝对开头, perl5 新方式 |
\a | 行首, perl5 新方式 |
\Z | 字符串绝对末尾, perl5 新方式 |
\z | 行尾部, perl5 新方式 |
$str = 'hello worldhi worldwelcome world';
# hello 为字符串绝对开头, hi 为行首.
5. 字符集简写
对于出现批量比较高的正则表达式分组, Perl 提供了简写模式. 但是使用简写模式时需要注意使用的编码模式时ASCII 码还是Unicode 编码.
锚点符号 | 含义 |
---|---|
\s | 匹配任意空白符,可匹配空格符,换行符,水平制表符, 换页符, 回车符 |
\d | 匹配数字0-9 |
\w | 匹配任意单个字符, ASCII码方式匹配[a-zA-Z0-9_], Unicode模式可匹配更多 |
\R | 匹配断行符, 匹配\r\n 或 \n |
\W | 反义简写, 等价于 [^\w] |
\D | 反义简写, 等价于 [^\d] |
\S | 反义简写, 等价于 [^\s] |
6. 返回值
对于正则匹配, 判断结果只有两种,要么是匹配,要么是不匹配.
- 返回空: 不匹配
- 返回1: 匹配
$str="hello,wolrd";$has_x = $str =~ /x/;
$has_o = $str =~ /o/;# 输出结果: has_x:, has_o:1
print "has_x:$has_x, has_o:$has_o\n";
14. Perl 正则表达式-正则匹配相关推荐
- 16. Perl 正则表达式-正则替换
正则表达式除了判断字符串是否匹配某个模式之外,也可以将匹配到的字符串进行替换. 1. 正则替换语法 默认正则表达式只替换一次 默认正则表达式返回替换的次数 1.1 简写语法 简写方式就是对于内置变量$ ...
- perl中正则匹配中文字符
写下这个题目,首先要区分的是,不是在perl的正则中找到中文,那样只要根据字符集的范围就可以找到,而是要找到给定中文字符串中是否包括指定的字词,比如,当下的某个系统中需要过滤 不厚先生的 名字. 通常 ...
- 15. Perl 正则表达式-正则捕获
正则表达式在匹配过程中,可以通过小括号()对匹配内容进行捕获或分组. 1. 捕获变量 1.1 引用捕获变量 对于捕获变量的引用分为两种方式, 在匹配模式中, 和匹配模式外. 引用方式 含义 \n 匹配 ...
- perl 正则表达式之匹配
一.用m//进行匹配 上篇用双斜线的写法表示模式,事实上是m//的简写,所谓简写,就是当用双斜线作为定界符的时候,可有省略开头的m. 不使用简写的时候,可以使用任何定界符表示模式,m().m<& ...
- 【perl】正则匹配中的括号套括号的套娃抓取规则
前言 从上周开始,我忽然有一个疑问,当我在进行正则匹配时,用括号可以抓取匹配上的内容,多个括号可以对应到$1.$2.$3等: 那么问题来了,如果括号进行套娃的话,应该如何用$1.$2.$3捕获呢? 是 ...
- posix,perl正则表达式区别
1.正则表达式(Regular Expression,缩写为regexp,regex或regxp),又称正规表达式.正规表示式或常规表达式或正规化表示法或正规表示法,是指一个用来描述或者匹配一系列符合 ...
- php正则匹配是否为url地址,php正则匹配网址-正则php-php正则匹配url地址
php正则表达式 正则匹配网址是否带http:// https:// if(preg_match("/\x20*https?\:\/\/.*/i","",$m) ...
- php正则匹配字符_php中字符串和正则表达式详解
一.字符串类型的特点 1.PHP是弱类型语言,其他数据类型一般都可以直接应用于字符串函数操作. echo substr("123456",2,4); //输出345 echo s ...
- Perl正则表达式(2) - 用正则表达式进行匹配
Perl正则表达式 2. 用正则表达式进行匹配 2.1 用 m// 进行匹配 到目前为止,我们都是讲正则表达式的内容写在一对斜线内,如/fred/.但其实这是 m// 的简写,其中m代表match,和 ...
最新文章
- 【牛客网】牛客练习赛19 F 算式子【数学--递推 、前缀、数字】
- firewall添加白名单_firewall的规则设置与命令(白名单设置)
- Arrays(Chapter 6 of JavaScript: The Good Parts)
- 关于NTDDI_VERSION,_WIN32_WINNT,WINVER的含义
- 【BZOJ 1096】[ZJOI2007]仓库建设
- TypeScript输入参数的默认值一例,以及对应生成的JavaScript代码分析
- Swift基础语法学习-4.Bool类型
- python创建和删除文件有什么区别_python创建与删除临时文件夹的例子
- 【面试题】---前端需要掌握的知识点-----更新...
- 游戏开发之友元类和友元函数(C++基础)
- 8.UNIX 环境高级编程--进程控制
- 这10款APP,让残障人士出行无忧!
- openvino系列 16. OpenVINO 手写字体识别 OCR
- 新编c语言程序设计案例教程 pdf下载,新编C语言程序设计教程本科第章.pdf
- 鼠标按下拖拽移动盒子
- 马力测试 软件,【图】【分享百公里加速测试软件DYNOLICIOUS】内附楼主的测试结果!...
- 美国这几年的人口死亡数据
- IOS开发入门之二——第一个App
- FileZilla的安装及使用
- 练习题记录:求解距离矩阵,首先生成一百个二维坐标点,计算任意两个坐标点的距离