Perl正则表达式(1) - 正则表达式基础知识

版权声明:转载请说明出处! https://blog.csdn.net/qq_39556143/article/details/85010570

Perl正则表达式

1. 基础知识

  • Perl中正则表达式(regular expression)默认匹配 $_ 中的字符串,匹配成功就返回真,否则返回假;
  • Perl匹配正则表达式时,可以使用变量内插,先完成变量内插,取出变量中的字符串后,编译正则表达式。

1.1 regex中的通配符

  • 点号 . (元字符)
    • 可以匹配除换行符 \n 之外的任意单个字符;
    • 点号 . 代表的不是它字符本身,但是可以匹配点这个字符(可以匹配自己)
    • 只想匹配单个点 . 字符,可以先用反斜线转义 .
    • 如果不喜欢使用点 . ,可以使用\N,效果一致 (后面介绍\N的含义)

1.2 regex中的量词

  • Perl中用到的常见量词包括 * + ? ,其具体含义见下表。
    表1.2 正则表达式量词以及对应的广义形式
匹配次数 元字符 广义写法 示例 说明
可有可无 {0,1} /ab?a/ 字符b可以出现一次或者不出现
零次或多次 * {0,} /ab*a/ 字符b可以不出现或者出现多次
一次或多次 + {1,} /ab+a/ 字符b可以出现一次或者出现多次
最少n次 {3,} /ab{3,}a/ 字符b至少出现三次
指定重复范围 {2,5} /ab{2,5}a/ 字符b出现2~5次
指定准确次数 {8} /ab{8}a/ 字符b只能出现8次

1.3 regex中的模式分组

  • perl中我们可以使用圆括号()将模式字符分组,所以圆括号也是元字符。
  1. 在此之前,量词只作用于它之前的那个字符,使用()进行模式分组以后,此时量词对应要重复的就是()围起来的部分,比如/(fred)+/,可以匹配fredfredfred这样的字符。
  2. 可以反向引用圆括号()中匹配的字符,我们可以取得()中匹配的结果,又称这种分组为捕获分组

表1.3 模式分组匹配示例及相关说明 (以字符串"abbbabbb"为例)

示例字符串 示例 匹配结果 情况说明
abba /(.)\1/ 匹配第一个"bb" (.)为模式分组,\1为捕获分组
yabb dabb /y(…) d\1/ 匹配整个字符串 ()圆括号中可以包含多个字符,\1表示反向引用第一组模式
yabba dabba /y(.)(.)\2\1/ 匹配’abba’ \2表示反向引用第二组模式分组(第二组圆括号中匹配的字符)
yabba dabba /y((.)(.)\3\2) d\1/ 匹配整个字符串 反向引用中的数字指的是第几个左方括号中的内容
aa11bb /(.)\g{1}11/ 匹配’aa11’ \g{n}中的n指的是反向引用第n个左圆括号中的内容 (绝对位置)
aa11bb /(.)\g{-1}11/ 匹配’aa11’ \g{n}中的n指的是反向引用左侧最靠近它的第n个左圆括号中的内容(相对位置)

1.4 regex中的择一匹配

  • 模式中的竖线字符 | ,也叫作或,表示择一匹配,要么左侧部分匹配,要么右侧部分匹配(左侧优先)
#!/usr/bin/perl
#包含两个操作符
foreach (qw/fred betty barney dino/) {
	if (/fred|betty/) {
		print "$_\n";
	}
}
#Result 
fred
betty
#包含三个操作符
foreach (qw/fred betty barney dino/) {
	if (/fred|betty|barney/) {
		print "$_\n";
	}
}
#Result 
fred
betty
barney
#其他使用方式
if (/fred|betty barney/)    #匹配fred或batty barney,等于/fred|(betty barney)/的结果
if (/(fred|betty) barney/)  #使用圆括号限制可选区域,匹配fred barney 或 betty barney
if (/fred( |\t)+barney/)    #可以匹配fred和betty之间至少有一个以上空格或者制表符
if (/fred( +|\t)barney/)    #fred和barney之间有一个以上空格或者一个制表符时匹配成功

1.5 regex中的字符集

  • 模式中的字符集是指单个位置上能匹配的各种模式字符的集合,我们可以把这些字符归集到方括号中,比如[abcdef],只要某个位置上出现的字符是这6个字符中的任意一个,就算匹配成功。
  • 为了定义方便,我们可以使用连字符(-)指定范围如[a-zA-Z]表示所有英文字母的大小写,[0-9]表示所有数字等
    • 字符集中如果需要匹配连字符本身:
    • 要么转义[a-z],只匹配a,连字符,z三个字符;
    • 要么将连字符写在首位处,如[-a],[b-]
  • 某些时候,反过来指定要排除匹配的字符更为方便,那么只需要在字符集内部的开头加上脱字符^
    • [^def] #任何一个不是d e f的字符
    • [^n-z] #小写 n 到 z 的所有字符都不行,其他字符可以
    • [^n\-z] #小写字符 n z 和连字符 - 不可以,其他都可以
  • 字符集的简写

表1.5 字符集的简写及对应的反义形式

简写 匹配 说明
\d 十进制数字 匹配数字0 ~ 9
\D 非十进制数字 匹配数字0 ~ 9之外的其他字符
\s 空白字符 [\f\t\n\ ]等字符(未完待续)
\S 非空白字符 除[\f\t\n\ ]之外的字符
\h 水平空白字符 [\t\ ] v5.10开始支持
\H 非水平空白字符 [\t\ ]之外的其他字符 v5.10开始支持
\v 纵向空白字符 (待补充)
\V 非纵向空白字符 (待补充)
\R 一般化的行结尾字符 包含\n, \r\n 及Unicode中定义的换行符
\w 单词字符 单词包括字母,数字,下划线
\W 非单词字符 字母,数字,下划线之外的字符
\n 换行符 不是真正意义的简写,就是一个字符
\N 非换行符 换行符之外的任意字符,和 点 . 一致

猜你喜欢

转载自blog.csdn.net/qq_39556143/article/details/85010570