正则表达式是一种匹配格式,由字母(大小写敏感)、字符以及数字等组成。 练习
1、元字符
| 元字符 | 描述 |
|---|---|
| . | 点号匹配任意单个字符除了换行符 |
| [ ] | 字符种类。匹配方括号中的任意字符 |
| [^ ] | 取反操作。匹配除了方括号内的任意字符 |
| * | 匹配>=0个重复的在* 号之前的字符 |
| + | 匹配>=1个重复的在+ 号之前的字符 |
| ? | 匹配0个或1个?号之前的字符,即标记?之前的字符为可选 |
| (xyz) | 字符集,匹配与xyz完全相等的字符串 |
| {n,m} | 匹配 [n,m] 个大括号之前的字符或字符集 |
| | | 或运算符,匹配符号前或后的字符 |
| \ | 转义字符,用于匹配一些保留的字符,如[ ] ( ) { } . * + ? ^ $ \ | 等 |
| 从开始行开始匹配 | |
| $ | 从末端开始匹配 |
1.1 点运算符
. 匹配任意单个字符,但不匹配换⾏符。
1.2 字符集
字符集也叫做字符类。⽅括号⽤来指定⼀个字符集。
在⽅括号中使⽤连字符来指定字符集的范围。
在⽅括号中的字符集不关⼼顺序。
^ 一般用来表示⼀个字符串的开头,但它⽤在⼀个⽅括号的开头的时候,它表示这个字符集是否定的。
1.3 重复次数
*号匹配 在*之前的字符出现⼤于等于0 次。*字符和.字符搭配可以匹配所有的字符.*。*和表示匹配空格的符号\s连起来⽤,\s*表示匹配0个空格或更多个空格。+号匹配+号之前的字符出现 >=1 次。- 元字符
?标记在符号前⾯的字符为可选,即出现 0 或 1 次。
1.4 { }号
在正则表达式中 {} 是⼀个量词,常⽤来限定⼀个或⼀组字符可以重复出现的次数。
{n,m},我们可以省略第⼆个参数m,表示至少出现n次。如果逗号也省略掉则表示重复固定的次数n。
1.5 (...) 特征标群
特征标群是一组写在 (...) 中的子模式。(...) 中包含的内容将会被看成一个整体,和数学中小括号
( )的作用相同。
我们还可以在 () 中⽤或字符 | 表示或
1.6 | 或运算符
或运算符就表示或,⽤作判断条件。
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中的一个或多个字符。
3.1 ?=... 正先⾏断⾔(存在)
?=... 正先⾏断⾔,表示第⼀部分表达式之后必须跟着 ?=... 定义的表达式。返回结果只包含满⾜匹配条件的第⼀部分表达式。
定义⼀个正先⾏断⾔要使⽤ () 。在括号内部使⽤⼀个问号和等号: (?=...) 。正先⾏断⾔的内容写在括号中的等号后⾯。
3.2 ?!... 负先⾏断⾔(排除)
负先⾏断⾔ ?! ⽤于筛选所有匹配结果,筛选条件为其后不跟随着断⾔中定义的格式。
正先⾏断⾔ 定义和 负先⾏断⾔ ⼀样,区别就是 = 替换成 ! 也就是 (?!...) 。
如:表达式 (T|t)he(?!\sfat) 匹配 The 和 the ,且其后不跟着 (空格)fat 。
3.3 ?<= ... 正后发断⾔(存在)
正后发断⾔ 记作(?<=...) ⽤于筛选所有匹配结果,筛选条件为 其前跟随着断⾔中定义的格式。
如:表达式 (?<=(T|t)he\s)(fat|mat) 匹配 fat 或 mat ,且其前跟着 The 或 the 。
3.4 ?<!... 负后发断⾔
负后发断⾔ 记作 (?<!...) ⽤于筛选所有匹配结果,筛选条件为 其前不跟随着断⾔中定义的格式。
如:表达式 (?<!(T|t)he\s)(cat) 匹配 cat ,且其前不跟着 The 或 the 。
4、标志
标志也叫模式修正符,因为它可以⽤来修改表达式的搜索结果。
这些标志可以任意的组合使⽤,它也是整个正则表达式的⼀部分。
| 标志符 | 描述 |
|---|---|
| i | 忽略大小写 |
| g | 全局搜索 |
| m | 多行修饰符:锚点元字符^ $工作范围在每行的起始 |
4.1 忽略大小写(Case Insensitive)
修饰语i⽤于忽略⼤⼩写。
4.2 全局搜索 (Global search)
修饰符 g 常⽤于执⾏⼀个全局搜索匹配,即(不仅仅返回第⼀个匹配的,⽽是返回全部)。
4.3 多⾏修饰符 (Multiline)
多⾏修饰符 m 常⽤于执⾏⼀个多⾏匹配。
像之前介绍的 (^,$) ⽤于检查格式是否是在待检测字符串的开头或结尾。但我们如果想要它在每⾏的
开头和结尾⽣效,我们需要⽤到多⾏修饰符 m 。
5、贪婪匹配与惰性匹配 (Greedy vs lazy matching)
正则表达式默认采⽤贪婪匹配模式,在该模式下意味着会匹配尽可能⻓的⼦串。我们可以使⽤ ? 将贪婪
匹配模式转化为惰性匹配模式。