正则表达式相关概念

153 阅读4分钟

正则表达式是一种匹配格式,由字母(大小写敏感)、字符以及数字等组成。 练习

1、元字符

元字符描述
.点号匹配任意单个字符除了换行符
[ ]字符种类。匹配方括号中的任意字符
[^ ]取反操作。匹配除了方括号内的任意字符
*匹配>=0个重复的在* 号之前的字符
+匹配>=1个重复的在+ 号之前的字符
匹配0个或1个?号之前的字符,即标记?之前的字符为可选
(xyz)字符集,匹配与xyz完全相等的字符串
{n,m}匹配 [n,m] 个大括号之前的字符或字符集
|或运算符,匹配符号前或后的字符
\转义字符,用于匹配一些保留的字符,如[ ] ( ) { } . * + ? ^ $ \ | 等
从开始行开始匹配
$从末端开始匹配

1.1 点运算符

. 匹配任意单个字符,但不匹配换⾏符。

image.png

image.png

1.2 字符集

字符集也叫做字符类。⽅括号⽤来指定⼀个字符集。 在⽅括号中使⽤连字符来指定字符集的范围。 在⽅括号中的字符集不关⼼顺序

image.png

^ 一般用来表示⼀个字符串的开头,但它⽤在⼀个⽅括号的开头的时候,它表示这个字符集是否定的。

image.png

1.3 重复次数

  • * 号匹配 在* 之前的字符出现⼤于等于0 次。
  • * 字符和. 字符搭配可以匹配所有的字符.*
  • * 和表示匹配空格的符号\s 连起来⽤,\s*表示匹配0个空格或更多个空格。
  • + 号匹配+ 号之前的字符出现 >=1 次。
  • 元字符 ? 标记在符号前⾯的字符为可选,即出现 0 或 1 次。

1.4 { }号

在正则表达式中 {} 是⼀个量词,常⽤来限定⼀个或⼀组字符可以重复出现的次数。

{n,m},我们可以省略第⼆个参数m,表示至少出现n次。如果逗号也省略掉则表示重复固定的次数n。

1.5 (...) 特征标群

特征标群是一组写在 (...) 中的子模式。(...) 中包含的内容将会被看成一个整体,和数学中小括号 ( )的作用相同。

我们还可以在 () 中⽤或字符 | 表示

1.6 | 或运算符

或运算符就表示或,⽤作判断条件。

image.png

1.7 转码特殊字符

反斜线 \ 在表达式中用于转码紧跟其后的字符。用于指定 { } [ ] / \ + * . $ ^ | ? 这些特殊字 符。如果想要匹配这些特殊字符则要在其前面加上反斜线\\.? 是选择性匹配.

1.8 锚点

在正则表达式中,想要匹配指定开头或结尾的字符串就要使⽤到锚点。^ 指定开头, $ 指定结尾。

  • ^ ⽤来检查匹配的字符串是否在所匹配字符串的开头。
  • 同理, $ 号⽤来匹配字符是否是最后⼀个。

2、简写字符集

简写描述
.除换⾏符外的所有字符
\w匹配所有字⺟数字,等同于 [a-zA-Z0-9_]
\W匹配所有⾮字⺟数字及符号,等同于: [^\w]
\d匹配数字: [0-9]
\D匹配⾮数字: [^\d]
\s匹配所有空格字符,等同于: [\t\n\f\r\p{Z}]
\S匹配所有⾮空格字符: [^\s]
\f匹配⼀个换⻚符
\n匹配⼀个换⾏符
\r匹配⼀个回⻋符
\t匹配⼀个制表符
\v匹配⼀个垂直制表符
\p匹配 CR/LF(等同于 \r\n ),⽤来匹配 DOS ⾏终⽌符

3、零宽度断⾔(前后预查)

先⾏断⾔和后发断⾔都属于⾮捕获簇(不捕获⽂本 ,也不针对组合计进⾏计数)。

先⾏断⾔⽤于判断所匹配的格式是否在另⼀个确定的格式之前,匹配结果不包含该确定格式(仅作为约 束)。

零宽度断⾔如下表格:

符号描述
?=正先⾏断⾔-存在
?!负先⾏断⾔-排除
?<=正后发断⾔-存在
?<!负后发断⾔-排除

例如,我们想要获得所有跟在 $ 符号后的数字,/(?<=\$)[0-9]+/,这个表达式匹配$开头,之后跟着 0,1,2,3,4,5,6,7,8,9中的一个或多个字符。

image.png

3.1 ?=... 正先⾏断⾔(存在)

?=... 正先⾏断⾔,表示第⼀部分表达式之后必须跟着 ?=... 定义的表达式。返回结果只包含满⾜匹配条件的第⼀部分表达式

定义⼀个正先⾏断⾔要使⽤ () 。在括号内部使⽤⼀个问号和等号: (?=...) 。正先⾏断⾔的内容写在括号中的等号后⾯。

image.png

3.2 ?!... 负先⾏断⾔(排除)

负先⾏断⾔ ?! ⽤于筛选所有匹配结果,筛选条件为其后不跟随着断⾔中定义的格式。

正先⾏断⾔ 定义和 负先⾏断⾔ ⼀样,区别就是 = 替换成 ! 也就是 (?!...)

如:表达式 (T|t)he(?!\sfat) 匹配 The 和 the ,且其后不跟着 (空格)fat

image.png

3.3 ?<= ... 正后发断⾔(存在)

正后发断⾔ 记作(?<=...) ⽤于筛选所有匹配结果,筛选条件为 其前跟随着断⾔中定义的格式

如:表达式 (?<=(T|t)he\s)(fat|mat) 匹配 fat 或 mat ,且其前跟着 The 或 the

image.png

3.4 ?<!... 负后发断⾔

负后发断⾔ 记作 (?<!...) ⽤于筛选所有匹配结果,筛选条件为 其前不跟随着断⾔中定义的格式。

如:表达式 (?<!(T|t)he\s)(cat) 匹配 cat ,且其前不跟着 The 或 the

image.png

4、标志

标志也叫模式修正符,因为它可以⽤来修改表达式的搜索结果。

这些标志可以任意的组合使⽤,它也是整个正则表达式的⼀部分。

标志符描述
i忽略大小写
g全局搜索
m多行修饰符:锚点元字符^ $工作范围在每行的起始

4.1 忽略大小写(Case Insensitive)

修饰语i⽤于忽略⼤⼩写。

4.2 全局搜索 (Global search)

修饰符 g 常⽤于执⾏⼀个全局搜索匹配,即(不仅仅返回第⼀个匹配的,⽽是返回全部)。

4.3 多⾏修饰符 (Multiline)

多⾏修饰符 m 常⽤于执⾏⼀个多⾏匹配。

像之前介绍的 (^,$) ⽤于检查格式是否是在待检测字符串的开头或结尾。但我们如果想要它在每⾏的 开头和结尾⽣效,我们需要⽤到多⾏修饰符 m

image.png

image.png

image.png

5、贪婪匹配与惰性匹配 (Greedy vs lazy matching)

正则表达式默认采⽤贪婪匹配模式,在该模式下意味着会匹配尽可能⻓的⼦串。我们可以使⽤ ? 将贪婪 匹配模式转化为惰性匹配模式。

image.png