1、什么是正则表达式?
正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。
优点:速度快、效率高、准确性高
缺点: 难度有一点大
2、语法
正则表达式的组件可以是单个的字符、字符集合、字符范围、字符间的选择或者所有这些组件的任意组合。
正则表达式的模式可以包括以下内容:
字面值字符:例如字母、数字、空格等,可以直接匹配它们自身。
特殊字符:例如点号
.
、星号*
、加号+
、问号?
等,它们具有特殊的含义和功能。字符类:用方括号
[ ]
包围的字符集合,用于匹配方括号内的任意一个字符。元字符:例如
\d
、\w
、\s
等,用于匹配特定类型的字符,如数字、字母、空白字符等。量词:例如
{n}
、{n,}
、{n,m}
等,用于指定匹配的次数或范围。边界符号:例如
^
、$
、\b
、\B
等,用于匹配字符串的开头、结尾或单词边界位置。
3、修饰符
标记也称为修饰符,正则表达式的标记用于指定额外的匹配策略。
标记不写在正则表达式里,标记位于表达式之外,格式如下:
/pattern/flags
下表列出了正则表达式常用的修饰符:
修饰符 | 含义 | 描述 |
---|---|---|
i | ignore - 不区分大小写 | 将匹配设置为不区分大小写,搜索时不区分大小写: A 和 a 没有区别。 |
g | global - 全局匹配 | 查找所有的匹配项。 |
m | multi line - 多行匹配 | 使边界字符 ^ 和 $ 匹配每一行的开头和结尾,记住是多行,而不是整个字符串的开头和结尾。 |
s | 特殊字符圆点 . 中包含换行符 \n | 默认情况下的圆点 . 是匹配除换行符 \n 之外的任何字符,加上 s 修饰符之后, . 中包含换行符 \n。 |
4、元字符
匹配字符:
1 . 匹配除换行符以外的任意字符
2 \w 匹配字母或数字或下划线
3 \s 匹配任意的空白符
4 \d 匹配数字
5 \n 匹配一个换行符
6 \t 匹配一个制表符
7 ^ 匹配字符串的开始
8 $ 匹配字符串的结尾
1 \W 匹配非字母或数字或下划线
2 \D 匹配非数字
3 \S 匹配非空白符
4 a l b 匹配字符a或字符b
5 ( ) 匹配括号内的表达式,也表示一个组
6 [...] 匹配字符组中的字符
7 [^...] 匹配除了字符组中字符的所有字符
量词:控制前面的元字符出现的次数 :
1 * 重复零次或多次
2 + 重复一次或更多次
3 ? 重复零次或一次
4 {n} 重复n次
5 {n,} 重复n次或更多次
6 {n,m} 重复n到m次
5、运算符优先级
以下是一些常见正则表达式运算符按照优先级从高到低的顺序:
-
转义符号:
\
是用于转义其他特殊字符的转义符号。它具有最高的优先级。示例:
\d
、\.
等,其中\d
匹配数字,\.
匹配点号。 -
括号: 圆括号
()
用于创建子表达式,具有高于其他运算符的优先级。示例:
(abc)+
匹配 "abc" 一次或多次。 -
量词: 量词指定前面的元素可以重复的次数。
示例:
a*
匹配零个或多个 "a"。 -
字符类: 字符类使用方括号
[]
表示,用于匹配括号内的任意字符。示例:
[aeiou]
匹配任何一个元音字母。 -
断言: 断言是用于检查字符串中特定位置的条件的元素。
示例:
^
表示行的开头,$
表示行的结尾。 -
连接: 连接在没有其他运算符的情况下表示字符之间的简单连接。
示例:
abc
匹配 "abc"。 -
管道: 管道符号
|
表示"或"关系,用于在多个模式之间选择一个。示例:
cat|dog
匹配 "cat" 或 "dog"。
6、匹配规则
模式,是正则表达式最基本的元素,它们是一组描述字符串特征的字符。模式可以很简单,由普通的字符串组成,也可以非常复杂,往往用特殊的字符表示一个范围内的字符、重复出现,或表示上下文。例如:
^once
这个模式包含一个特殊的字符 ^,表示该模式只匹配那些以 once 开头的字符串。例如该模式与字符串 "once upon a time" 匹配,与 "There once was a man from NewYork" 不匹配。正如如 ^ 符号表示开头一样,$ 符号用来匹配那些以给定模式结尾的字符串。
bucket$
这个模式与 "Who kept all of this cash in a bucket" 匹配,与 "buckets" 不匹配。字符 ^ 和 $ 同时使用时,表示精确匹配(字符串与模式一样)。例如:
^bucket$
只匹配字符串 "bucket"。如果一个模式不包括 ^ 和 $,那么它与任何包含该模式的字符串匹配。例如模式:
once
与字符串
There once was a man from NewYork Who kept all of his cash in a bucket.
是匹配的。
在该模式中的字母 (o-n-c-e) 是字面的字符,也就是说,他们表示该字母本身,数字也是一样的。其他一些稍微复杂的字符,如标点符号和白字符(空格、制表符等),要用到转义序列。所有的转义序列都用反斜杠 \ 打头。制表符的转义序列是 \t。所以如果我们要检测一个字符串是否以制表符开头,可以用这个模式:
^\t
类似的,用 \n 表示"新行",\r 表示回车。其他的特殊符号,可以用在前面加上反斜杠,如反斜杠本身用 \\ 表示,句号 . 用 \. 表示,以此类推。
7、例子
正则表达式 | 描述 |
---|---|
/\b([a-z]+) \1\b/gi | 一个单词连续出现的位置。 |
/(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)/ | 匹配一个 URL 解析为协议、域、端口及相对路径。 |
/^(?:Chapter|Section) [1-9][0-9]{0,1}$/ | 定位章节的位置。 |
/[-a-z]/ | a 至 z 共 26个 字母再加一个 - 号。 |
/ter\b/ | 可匹配 chapter,而不能匹配 terminal。 |
/\Bapt/ | 可匹配 chapter,而不能匹配 aptitude。 |
/Windows(?=95 |98 |NT )/ | 可匹配 Windows95 或 Windows98 或 WindowsNT,当找到一个匹配后,从 Windows 后面开始进行下一次的检索匹配。 |
/^\s*$/ | 匹配空行。 |
/\d{2}-\d{5}/ | 验证由两位数字、一个连字符再加 5 位数字组成的 ID 号。 |
<[a-zA-Z]+.*?>([\s\S]*?)</[a-zA-Z]*?> | 匹配 HTML 标记。 |
正则表达式 | 描述 |
---|---|
hello | 匹配 {hello} |
gray|grey | 匹配 {gray, grey} |
gr(a|e)y | 匹配 {gray, grey} |
gr[ae]y | 匹配 {gray, grey} |
b[aeiou]bble | 匹配 {babble, bebble, bibble, bobble, bubble} |
[b-chm-pP]at|ot | 匹配 {bat, cat, hat, mat, nat, oat, pat, Pat, ot} |
colou?r | 匹配 {color, colour} |
rege(x(es)?|xps?) | 匹配 {regex, regexes, regexp, regexps} |
go*gle | 匹配 {ggle, gogle, google, gooogle, goooogle, ...} |
go+gle | 匹配 {gogle, google, gooogle, goooogle, ...} |
g(oog)+le | 匹配 {google, googoogle, googoogoogle, googoogoogoogle, ...} |
z{3} | 匹配 {zzz} |
z{3,6} | 匹配 {zzz, zzzz, zzzzz, zzzzzz} |
z{3,} | 匹配 {zzz, zzzz, zzzzz, ...} |
[Bb]rainf\*\*k | 匹配 {Brainf**k, brainf**k} |
\d | 匹配 {0,1,2,3,4,5,6,7,8,9} |
1\d{10} | 匹配 11 个数字,以 1 开头 |
[2-9]|[12]\d|3[0-6] | 匹配 2 到 36 范围内的整数 |
Hello\nworld | 匹配 Hello 后跟换行符,后跟 world |
\d+(\.\d\d)? | 包含一个正整数或包含两位小数位的浮点数。 |
[^*@#] | 排除 *、@ 、# 三个特色符号 |
//[^\r\n]*[\r\n] | 匹配 // 开头的注释 |
^dog | 匹配以 "dog" 开始 |
dog$ | 匹配以 "dog" 结尾 |
^dog$ | is exactly "dog" |