思维导图截图:
# 正则表达式(regular expression)
正则表达式,包括普通字符和特殊字符(元字符)。
## 1 简介
### 可以测试字符串内的模式-测试字符串内是否出现电话模式或信用卡号码模式--数据验证。
### 可以替换文本-使用正则识别文档中的特定文本并进行替换。
### 可以基于模式匹配从字符串中提取子字符串。
### 各个开发语言(vi,c++,awk,sed,python,java,php,c+...)都做了正则的支持
## 2 语法基础
### 包括两部分:普通字符和元字符
- 普通字符:没有显示指定为元字符的所有可以打印和不可打印的字符(大小写字母、数字、标点符号、其他符号等)
- [ABC]匹配ABC三个字符
- [^ABC]匹配除了ABC的其他字符
- [A-Z]匹配所有大写字母,a-z所有小写字母,0-9所有数字
- .除了换行符之外的任务单字符,相当于[^\n\r]
- [\s\S]匹配所有。\s是匹配所有空白符包括换行,\S是非空白符
- \w 匹配字母、数字、下划线,等价于[A-Za-z0-9_]
- 特殊字符:如果要匹配元字符,需要在前加\转义。
- $:匹配结尾位置。
- ():标记一个子表达式的开始和结束位置。
- *:匹配前面的子表达式0次或多次
- +:匹配前面的子表达式一次或多次
- .:匹配除换行符\n之外的任何单字符
- [:标记一个中括号表达式的开始
- ?:匹配前面的子表达式0次或一次,或指明一个非贪婪限定符。
- \:将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。
- ^:匹配输入字符串的开始位置,除非是在方括号表达式中使用,在方括号中表示非(不接受该方括号表达式中的字符集合)。
- {:标记限定符表达式的开始
- |:指明两项之间的一个选择
- 限定符:用来指定正则表达式中的一个给定组件必须出现多少次才满足匹配:*或+或?或{n}或{n,}或{n,m}这6种
- *:匹配前面的子表达式0次或多次,等价于{0,}
- +:匹配前面的子表达式1次或多次,等价于{1,}
- ?:匹配前面的子表达式0次或1次,等价于{0,1}
- {n}:n是一个非负整数,匹配n次
- {n,}:n是一个非负整数,匹配至少n次
- {n,m}:n和m都是非负整数,最少匹配n次最多匹配m次
- 定位符:将正则表达式固定到行首或行尾、某个单词内、单词开头、单词结尾等。^和$分别指字符串的开始与结束,\b描述单词的前或后边界,\B表示非单词边界
- ^:匹配字符串开始
- $:匹配字符串结尾
- \b:匹配一个单词边界,即字与空格间的位置
- \B:非单词边界匹配
- 选择:用圆括号()将所有选择项括起来,相邻的选择项之间用 | 分隔
- 举例:([1-9])([a-z]+) 匹配一个数字开头多个字母结尾
- ?=、?<=、?!、?<! ----------------比较复杂,暂时跳过
## 5 示例
### 简单表达式
### 字符匹配
### 中括号表达式
### 替换和分组
## 4 匹配规则
### 基本模式匹配
### 字符簇
- 方括号[]
- 如[a-z],[A-Z],[a-zA-Z],[0-9],[0-9\.\-],[ \f\r\t\n]
- [^a-z],[^\\\/\^],[^\"\']
### 确定重复出现
- {n,m},{n},{n,},*,+,?
- ^[a-zA-Z0-9_]{1,}$ 所有包含1个以上的字母、数字及下划线
- ^[1-9][0-9]{0,}$ 所有正整数
- ^\-{0,1}[0-9]{1,}$ 所有整数
- ^[-]?[0-9]+\.?[0-9]+$ 所有浮点数
## 3 语法进阶
### 修饰符(标记):用于指定额外的匹配策略,不写在正则表达式内,写在正则表达式外 /表达式/标记
- i:ignore,不区分大小写
- g:global,全局匹配,查找所有匹配项
- m:multi line,多行匹配,使边界字符 ^$匹配每一行的开头和结尾,而不是整个字符串的开头结尾
- s:使.包含换行\n,.默认是不包含换行的
### 元字符!!!完整列表
- \
- 转义
- ^
- 匹配输入字符串的开始位置
- $
- 匹配字符串的结束位置
- *
- 匹配前面的表达式0次或多次
- +
- 匹配前面的表达式1次或多次
- ?
- 1. 匹配前面的表达式0次或1次;
2. 当该字符紧跟在任何一个其他限定符后面时,匹配模式是非贪婪的,也就是尽可能少的匹配所搜索的字符串:对于字符串 oooo,o+ 将匹配到所有o,o+? 匹配到o
- {n}
- 匹配前面的表达式n次
- {n,}
- 匹配前面的表达式至少n次
- {n,m}
- 匹配前面的表达式至少n次,最多m次
- .
- 匹配除了换行符(\n \r)之外的任何单字符,要匹配包含\n在内的任何字符,可以用 (.|\n)
- x|y
- 匹配x或y
- [xyz]
- 匹配[]中的任意一个字符
- [^xyz]
- 匹配[]未包含的任意字符
- [a-z]
- 所有小写字母
- [^a-z]
- 除了小写字母的其他任意字符
- \b
- 匹配一个单词边界:er\b可以匹配never的er,但是匹配不到verb的er
- \B
- 匹配非单词边界:er\B可以匹配到verb的er,但是匹配不到never的er
- \d
- 匹配一个数字字符,等价于[0-9]
- \D
- 匹配一个非数字字符,等价于[^0-9]
- \f
- 匹配一个换页符
- \n
- 匹配一个换行符
- \r
- 匹配一个回车符
- \s
- 匹配任何空白字符 包括空格 tab 换行等,等价于[ \f\n\r\t\v]
- \S
- 匹配任何非空白字符,等价于[^ \f\n\r\t\v]
- \t
- 匹配一个制表符 tab
- \v
- 匹配一个垂直制表符
- \w
- 匹配字母、数字、下划线,等价于[A-Za-z0-9_]
- \W
- 匹配非字母、数字、下划线,等价于[^A-Za-z0-9]
### 匹配邮箱示例:
/\b[\w.%+-]+@[\w.-]+\.[a-zA-Z]{2,6}\b/g
- 解析:
\b 单词边界;
[\w.%+-]字符集,\w字母数字下划线,.%+-是特殊字符;
+ 最少匹配一个
@ @符号
[\w.-] 字母数字下划线,.和-
+ 最少匹配一个
\. .号
[a-zA-Z]字母
{2,6}字母2~6个
\b单词边界
### 运算符优先级:
正则表达式从左到右计算,并遵循优先级顺序。相同优先级的从左到右,不同优先级的从高到低。右侧从最高到最低说明了正则的优先级
- \
- 转义符
- (),(?:),(?=),[]
- 括号
- *,+,?,{n},{n,},{n,m}
- 限定符
- ^,$,\任何元字符、任何字符
- 定位点和序列
- |
- 替换,或操作,m|food匹配m或food,(m|f)ood匹配mood或food