Javascript 正则表达式
· 阅读需 19 分钟
- 在线编写和检验正则的网站:https://regex101.com 支持多语言切换
- freeCodeCamp: Introduction to the Regular Expression Challenges
基础概念
创建方式
构造函数
const regex = new RegExp('abc', 'i');
字面量
const regex = /abc/i;
修饰符
g
:global,全文搜索,默认搜索到第一个结果停止搜索。i
:insensitive,不区分大小写,默认大小写敏感。m
:multiple line,多行搜索,更改^
和$
的含义,使它们分别在每行的行首和行尾匹配,默认是在整个字符串的开头和结尾匹配。s
:single line,单行模式,此模式下.
能匹配任意字符,包括换行符,默认是不包括的。
TODO
y
:sticky,必须从上一次匹配成功的下一个位置开始(lastIndex),作用是达到^
在全局匹配中都有效。u
:unicode,用来正确处理大于\uFFFF
的 Unicode 字符(对于大于\uFFFF
的字,把 4 字节的字符当做单独 1 个字来解析,否则当做 2 个 2 字节的字),把\u{}
当做 Unicode(否则当做正则内容)。默认按照 ES5 来处理字符,1 个字仅有 2 个字节。
元字符
大部分字符在正则表达式中,就是字面的含义,比如/a/
匹配 a,/b/
匹配 b。如果在正则表达式之中,某个字符只表示它字面的含义(就像前面的 a 和 b),那么它们就叫做“字面量字符”(literal characters)。
除了字面量字符以外,还有一部分字符有特殊含义,不代表字 面的意思。它们叫做“元字符”(meta characters),先介绍以下几个:
元字符 | 符号 | 说明 |
---|---|---|
选择类 | | | 或匹配,如 /x|y/ 正则可匹配 x 或 y 两个字符 |
选择类 | [] | 或匹配,如 [abcd] 代表一个字符,这个字符可以是 abcd 四个字符中的任意一个 |
范围类 | [0-9] | 0-9 中的任意一个字符 |
范围类 | [a-z] | a-z 中的任意一个字符 |
范围类 | [a-zA-Z0-9] | 大写字母、小写字母、数字中的任意一个字符 |
位置类 | ^ | 匹配字符串的开始 |
位置类 | $ | 匹配字符串的结束 |
预定义 | . | 匹配除回车(\r )、换行(\n ) 、行分隔符(\u2028 )和段分隔符(\u2029 )以外的任意字符 |
预定义 | \w | 匹配字母数字下划线,等同于 [a-zA-Z0-9_] |
预定义 | \s | 匹配任意空白符,等同于 [\r\n\t\f\v ] |
预定义 | \d | 匹配数字,等同于 [0-9] |
预定义 | \b | 匹配单词(字母、数字、下划线)边界,注意:- 也被认为是单词边界 |
预定义 | [\b] | 匹配退格符(backspace) |
预定义 | \t | 匹配水平制表符(tab) |
预定义 | \r | 匹配回车符(carriage return) |
预定义 | \n | 匹配换行符(linefeed) |
预定义 | \0 | 匹配空字符(NUL)不要在此后面跟小数点 |
预定义 | \v | 匹配垂直制表符(vertical tab) |
预定义 | \f | 匹配换页符(form-feed) |
其它元字符将会在后面进行介绍。
转义
需要使用 \
进行转义的元字符:
字符 | 说明 |
---|---|
\ | 因为已在转义中使用 |
( | 因为已在捕获中使用 |
) | 因为已在捕获中使用 |
[ | 因为已在范围类和反义中使用 |
. | 因为已在预定义字符中使用 |
^ | 因为已在位置类字符中使用 |
$ | 因为已在位置类字符中使用 |
| | 因为已在选择类字符中使用 |
* | 因为已在量词类中使用 |
+ | 因为已在量词类中使用 |
? | 因为已在量词类中使用 |
反义
反义字符 | 说明 |
---|---|
[^x] | 匹配除“x”之外的所有字符,其中“x”可以为任意字符 |
[^xyz] | 同上,匹配除“x、y、z”之外的任意字符 |
\W | 匹配除了字母、数字、下划线之外的所有字符,等同于 [^\w] |
\S | 匹 配除空白符之外的任意字符,等同于 [^\s] |
\B | 匹配不是单词边界的字符,等同于 [^\b] |
\D | 匹配不是数字的所有字符,等同于 [^\d] |
贪婪模式重复匹配
贪婪模式:即匹配直到下一个字符不满足匹配规则为止,这是一种最大可能匹配。
元字符 | 符号 | 重复出现次数 |
---|---|---|
量词符 | * | ≥ 0 |
量词符 | + | ≥ 1 |
量词符 | ? | 0 或 1 |
精确匹配 | {n} | n |
精确匹配 | {n,} | ≥ n |
精确匹配 | {m,n} | m ≤ count ≤ n |