前言: 正则表达式使用单个[字符串]来描述、匹配一系列匹配某个[句法规则]的字符串,通常被用来检索、替换那些符合某个模式(规则)的文本。
注1:前边的字符指前面单个字符。如需适用于多个字符需要使用()包括,如:(ab)+
注2:所有字符都可以嵌套使用
基础内容
+ * ?
+ 号表示前边的字符必须至少出现一次(1次或多次);
* 表示前边的字符可以不出现,或者出现一次或者多次(0次、或1次、或多次)
? 号表示前面的字符最多只可以出现一次(0次或1次)
{}
{}前面的字符出现的次数是4次,就用{4}表示
还可以允许我们输入一个范围;比如{2,4}表示前一个字符出现2到4次;
表示出现2次以上;就用{2,}表示;
| “或” 通配符 如果想找 a dog和a cat就在()里加“|”;这里前面会先区匹配“a”
字符类[]
字符类[]+可以匹配中括号里的字符,匹配到的字符只能取自于它们
[a-z]+ 表示匹配所有的小写英文字母;[A-Z]+ 表示匹配所有的大写英文字母;
[a-zA-Z]+ 表示匹配所有的英文字符;[a-zA-Z0-9]+ 表示所有的英文字符和数字
取反
[]+ 前边加 ^ ,就表示匹配除了尖号后边列出的【以外】的字符
常用字符
\d \w \s \D \W \S … 正则表达式的大多数元字符都以反斜杠开头;
d: \d 是数字字符,等同于之前写的 [0-9]+;
D: 与 \d 相对应的 \D 代表非数字字符
w: \w 代表单词字符(英文、数字及下划线)
W: 与 \w 相对应的 \W 代表非单词字符
s: \s 代表空白符 (包含Tab和换行符)
S: 与 \s 相对应的 \S 代表非空白字符
.: 其中 . 在正则表达式中也是一个特殊字符;它代表任意字符,但不包含换行字符。
^ $ : 两个特殊字符 ^ 匹配行首、$ 匹配行尾;
匹配机制
默认贪婪匹配机制,可以使用?切换为懒惰匹配
贪婪:会尽量匹配到更多符合要求的内容;
懒惰:仅仅找到第一个满足条件的匹配内容。
简单理解:在同一匹配条件下,贪婪 = 懒惰+右侧存在能匹配上的
<.+> 与 <.+?>
源字符串:aa<div>test1</div>bb<div>test2</div>cc
正则表达式一:<div>.*</div>
匹配结果一:<div>test1</div>bb<div>test2</div>
正则表达式二:<div>.*?</div>
匹配结果二:<div>test1</div>(这里一次匹配结果,所以没包括<div>test2</div>)
懒惰 = <div>test1</div>
贪婪在懒惰的基础上继续匹配右侧字符串,发现能继续匹配到 </div>
常用语法
- Flags(标志符或修饰符)
g
:全局匹配(global);正则表达式默认只会返回第一个匹配结果,使用标志符g则可以返回所有匹配
i
:忽略大小写(case-insensitive);在匹配时忽略英文字母的大小写
m
:多行匹配(multiline);将开始和结束字符(^和$)视为在多行上工作,即分别匹配每一行(由 \n 或 \r
分割)的开始和结束,而不只是只匹配整个输入字符串的最开始和最末尾处
Character Sets(字符集合)
用于匹配字符集合中的任意一个字符,常见的字符集有:
[xyz]
:匹配 “x"或"y”``“z”
[^xyz]
:补集,匹配除 “x” “y” "z"的其他字符
[a-z]
:匹配从 “a” 到 “z” 的任意字符
[^a-n]
:补集,匹配除 “a” 到 “n” 的其他字符
[A-Z]
:匹配从 “A” 到 “Z” 的任意字符
[0-9]
:匹配从 “0” 到 “9” 的任意数字比如匹配所有的字母和数字可以写成:
/[a-zA-Z0-9]/
或者/[a-z0-9]/i
。
Quantifiers (量词)
在实际使用中常需要匹配同一类型的字符多次,比如匹配 11 位的手机号,我们不可能将 [0-9] 写 11 遍,此时可以使用 Quantifiers 来实现重复匹配。
{n}
:匹配 n 次
{n,m}
:匹配 n-m 次
{n,}
:匹配 >=n 次
?
:匹配 0 || 1 次
*
:匹配 >=0 次,等价于 {0,}
+
:匹配 >=1 次,等价于 {1,}
Metacharacters(元字符)
常见的元字符有:
\d
:匹配任意数字,等价于 [0-9]
\D
:匹配任意非数字字符;\d 的补集
\w
:匹配任意基本拉丁字母表中的字母和数字,以及下划线;等价于 [A-Za-z0-9_]
\W
:匹配任意非基本拉丁字母表中的字母和数字,以及下划线;\w 的补集
\s
:匹配一个空白符,包括空格、制表符、换页符、换行符和其他 Unicode 空格
\S
:匹配一个非空白符;\s的补集
\b
:匹配一个零宽单词边界,如一个字母与一个空格之间;例如,/\bno/ 匹配 “at noon” 中的 “no”,/ly\b/ 匹配
“possibly yesterday.” 中的 “ly”
\B
:匹配一个零宽非单词边界,如两个字母之间或两个空格之间;例如,/\Bon/ 匹配 “at noon” 中的 “on”,/ye\B/
匹配 "possibly yesterday."中的 “ye”
\t
:匹配一个水平制表符(tab)
\n
:匹配一个换行符(newline)
\r
:匹配一个回车符(carriage return)