一、基本介绍
正则表达式(Regular Expression,简称Regex)是在一个主体字符串中从左到右匹配字符串时的一种样式。
- 大小写敏感
- 默认采用贪婪匹配,会匹配尽可能长的子串(优先)
- 默认捕获第一个匹配的字符串
二、元字符
正则表达式主要依赖于元字符. 元字符不代表他们本身的字面意思, 他们都有特殊的含义。需要注意的是,一些元字符写在方括号中的时候有一些特殊的意思。
严格从末尾匹配,“任一除换行符的字符”+“at” 加或者不加 “.”,即"(.)at"或"(.)at(.)"。
# 匹配"mat.",加上"."因为是贪心
# 若最后一行为"on the ma",则无法匹配任何
"/.at(.)?$/" => The fat
cat sat
on the mat.
2.1 . 点运算符
.匹配任意单个字符, 但不匹配换行符。
".ar" => car 或 war 或 jar 等
2.2 字符集(类)
1. 字符集
在方括号中使用连字符来指定单个字符集的范围,在方括号中的字符集不关心顺序。
"[Tt]he" => The 或 the
2. 否定字符集
一般来说 ^ 表示一个字符串的开头,但它用在一个方括号的开头的时候,它表示这个字符集是否定的。
# 不能是car
"[^c]ar" => war 等
2.3 重复字符
后面跟着元字符 + or * or ? 的,用来指定匹配子模式的次数,这些元字符在不同的情况下有着不同的意思。
1. * 号
*号匹配 在*之前的字符出现大于等于0次。
"[a-z]*" => 匹配一个行中所有以小写字母开头的字符串
表示匹配空格的符号\s
2. + 号
+号匹配+号之前的字符出现 >=1 次。
"c.+t" => cabc dt 或 ct
3. ? 号
? 标记在符号之前的字符为可选, 即出现 0 或 1 次。
"[T]he" => The 或 he
2.4 {} 号
{} 是一个量词,常用来一个或一组字符可以重复出现的次数。可以是{2},{2,}。
"[0-9]{2,3}" => 匹配最少 2~3 位 0~9 的数字
2.5 (…) 特征标群
在 {} 前加入特征标群则表示整个标群内的字符重复 N 次。例如,表达式 (ab)* 匹配连续出现 0 或更多个 ab。
"(c|g|p)ar" => car 或 gar 或 par
"(c){2,3}" => cc 或 ccc
2.6 | 或运算符
或运算符就表示或,用作判断条件。
"(T|t)he|car" => The 或 the 或 car
2.7 转码特殊字符
反斜线 \ 在表达式中用于转码紧跟其后的字符,用于指定 { } [ ] / \ + * . $ ^ | ? 这些特殊字符。
"(f|c|m)at\.?" => fat. 或 cat 等
2.8 锚点
想要匹配指定开头或结尾的字符串就要使用到锚点,^ 指定开头,$ 指定结尾。
"^(T|t)he" => 匹配"The car is parked in the garage"字符串中的"The",不匹配the
"(at\.)$" => 匹配"The fat cat. sat. on the mat."字符串中mat.中的"at.",不匹配其他at.
3. 简写字符集
正则表达式提供一些常用的字符集简写。
4. 零宽度断言(前后预查)
先行断言和后发断言都属于非捕获簇(不捕获文本 ,也不针对组合计进行计数)。先行断言用于判断所匹配的格式是否在另一个确定的格式之前,匹配结果不包含该确定格式(仅作为约束)。需要使用括号()
。
4.1 ?=… 正先行断言——存在
筛选条件为:其后必须跟着断言定义的格式。
"(T|t)he(?=\sfat)" => 匹配"The fat cat sat on the mat."字符串中" fat"前的"The"
4.2 ?!.. 负先行断言
筛选条件为:其后不跟随着断言中定义的格式。
"(T|t)he(?!\sfat)" => 匹配"The fat cat sat on the mat."字符串中后面不紧跟着" fat"的"the"
4.3 ?<= … 正后发断言
筛选条件为:其前跟随着断言中定义的格式。
"(?<=the\s)(fat|mat)" => 匹配"The fat cat sat on the mat."字符串中"the "后面紧跟着的"mat"
4.4 ?<!.. 负后发断言
筛选条件为:其前不跟随着断言中定义的格式。
"(?<!The\s)(cat)" => 匹配"The cat sat on cat."字符串中"The "后面不紧跟着的"cat"
理解:例如"(T|t)he(?=\sfat)",匹配The或the,且其后必须紧跟着"(空格)fat"。
5. 标志
标志也叫模式修正符,因为它可以用来修改表达式的搜索结果,这些标志可以任意的组合使用。用//
包含字符集,其后跟标志。
5.1 忽略大小写 (Case Insensitive)
匹配全局(g)忽略大小写(i)的"The"
或"the"
或"THE"
等。
"/The/gi" => The fat cat sat on the mat.
5.2 全局搜索 (Global search)
匹配全局(g)"除了换行符的任意字符+at"
的全部结果。
"/.(at)/g" => The fat cat sat on the mat.
5.3 多行修饰符 (Multiline)
匹配在每行的开头和结尾生效,用到多行修饰符 m。
# 匹配"fat"、"sat"、"mat."
"/.at(.)?$/gm" => The fat
cat sat
on the mat.
# 匹配最长的"mat."
"/.at(.)?$/" => The fat
cat sat
on the mat.
5.4 贪婪匹配与惰性匹配 (Greedy vs lazy matching)
正则表达式默认采用贪婪匹配模式,默认情况下,? + * {min, max}都是贪婪的。在该模式下意味着会匹配尽可能长的子串。我们可以在修饰匹配次数的特殊符号后再加上一个 ?
,将贪婪匹配模式转化为惰性匹配模式。
匹配默认匹配最长的,从开头一直到匹配到"fat"的"at",即"The fat"。
# 理解:惰性模式 "首部和尾部均第一次匹配成功,且首尾合理" 就停止,这里前面没有限定,从开头一直匹配到第一个at
"/(.*?at)/" => The fat cat sat on the mat.