正则表达式
1.概念
正则表达式是一种含有某种规则的模式,被用来检索、替换符合给定模式的文本。
全称为 Regular Expression,在 JavaScript 中简写为 RegExp。
2.字符
常用的元字符如下:
\ 转义符,例如匹配符号"*",则要写成"\*"。因为有些特殊字符是元字符,有特定含义,所以在匹配这些特殊符号时,要在符号前加 \ 。特殊符号比如 \ ^ $ . * + ? 等。
^ 匹配行或字符串的起始位置。
$ 匹配行或字符串的结尾位置。
. (点号)匹配除换行符之外的任何单个字符
\w 匹配包括下划线的任何单词字符(匹配字母、数字、下划线或汉字)。
\s 匹配任意空白字符。
\d 匹配一个数字字符。
\b 匹配单词的开始或结束位置。
[xyz] 字符集合,匹配所含的任意一个字符,等价于下面的 [a-z]。
[a-z] 字符范围,匹配指定范围内的任意字符
反义,顾名思义,就是相反的意思,对照着上面最后几个元字符看。
\W (注意是大写字母)匹配任何非单词字符(匹配不是字母、数字、下划线或汉字的字符)。
\S (注意是大写字母)匹配任何非空白字符。
\D (注意是大写字母)匹配一个非数字字符。
\B (注意是大写字母)匹配不是单词开始或结束的位置。
[^xyz] 负值字符集合,匹配未包含的任意字符。
[^a-z] 负值字符范围,匹配任何不在指定范围内的任意字符。
限定符
* 匹配前面的子表达式0次或多次。
+ 匹配前面的子表达式1次或多次。
? 匹配前面的子表达式0次或1次。
{n} n为非负整数,是一个确定的数字,匹配前面的子表达式n次。
{n,} n为非负整数,是一个确定的数字,匹配n次或多次。
{n,m} n和m均为非负整数,都是确定的数字,匹配最少n次,最多m次。
贪婪量词
*、+、? 限定符都是贪婪的,它们会尽可能多地匹配文字,在它们的后面加上一个 ? 就可以实现非贪婪或最小匹配。
*? 匹配多次,尽可能少匹配
+? 匹配1次或多次,尽可能少匹配
?? 匹配0次或1次,尽可能少匹配
{n,}? n为非负整数,是一个确定的数字,匹配n次或多次,尽可能少匹配
{n,m}? n和m均为非负整数,都是确定的数字,匹配最少n次,最多m次,尽可能少匹配
3.捕获分组
(exp) 匹配exp,并捕获文本到自动命名的组里。
(?<name>exp) 匹配exp,并捕获文本到名称为name的组里。
(?:exp) 匹配exp,不捕获匹配的文本,也不给此分组分配组号。
零宽断言
下面四个表达式用于查找在某些内容(不包括这些内容)之前或之后的文本,用于指定一个位置,这个位置要满足一定的条件(即断言),因此它们也被称为零宽断言。
(?=exp) 匹配exp前面的位置。
例如匹配字符串 "I love JavaScript" 的正则表达式为 "(?<txt>.+(?=ing))",这里取 "Script" 前面的所有字符,并定义了一个名字为 "txt" 的捕获分组,这个 "txt" 组里的值为 "I love Java"。
(?<=exp) 匹配exp后面的位置。
例如匹配字符串 "I love JavaScript" 的正则表达式为 "(?<txt>(?<=I).+)",这里取 "I" 后面的所有字符,并定义了一个名字为 "txt" 的捕获分组,这个 "txt" 组里的值为 " love JavaScript"。
(?!exp) 匹配后面跟的不是exp的位置。
例如匹配 "123abc",可以写成 "\d{3}(?!\d)",匹配3位数字后非数字的结果。
(?<!exp) 匹配前面不是exp的位置。
例如匹配 "abc123",可以写成 "(?<!\d123",匹配 "123" 前面是非数字的结果。
4、运算符优先级
正则表达式从左到右进行计算,并遵循优先级顺序。相同优先级从左到右进行计算,不同优先级先高后低。
下表从高级到低级排序:
\ 转义符
(),(?:),(?=),[] 圆括号和方括号
*,+,?,{n},{n,},{n,m} 限定符
^,$,\任何元字符、任何字符 定位点和序列
| 替换“或”操作
最后更新于2016.12.22