正则表达式常用方法
str.match(regexp)
- 如果不带有 g 标记,则以数组形式返回第一个匹配项,包含详细信息
- 如果带有 g,则将所有匹配项作为字符串返回,不包含详细信息
- 若没有匹配项,返回 null
str.matchAll(regexp)
- 它返回包含匹配项的可迭代对象,而不是数组。我们可以用 Array.from 从中得到一个常规数组。
- 每个匹配项均以包含分组的数组形式返回(返回格式与不带 g 标记的 str.match 相同)。
- 如果没有结果,则返回的不是 null,而是一个空的可迭代对象。
str.replace(str|regexp, str|func)
- 当 replace 的第一个参数是字符串时,它仅替换第一个匹配项
- 第二个参数是一个替代字符串。我们可以在其中使用特殊字符:
符号 | 替换字符串中的操作 |
---|---|
$& | 插入整个匹配项 |
$` | 在匹配项之前插入字符串的一部分 |
$’ | 在匹配项之后插入字符串的一部分 |
$n | 如果 n 是一个 1 到 2 位的数字,则插入第 n 个分组的内容,详见 捕获组 |
$ | 插入带有给定 name 的括号内的内容,详见 捕获组 |
$$ | 插入字符 $ |
"John Smith".replace(/(john) (smith)/i, "$2, $1"); // Smith, John
- 第二个参数可以是一个函数,每次匹配都会调用这个函数,并且返回的值将作为替换字符串插入。
"html and css".replace(/html|css/gi, (str) => str.toUpperCase()); // HTML and CSS
regexp.test(str)
- 查找匹配项,然后返回 true/false 表示是否存在,如
/love/i.test("I love JavaScript")
为 true
修饰符
大小写 i
搜索时不区分大小写
全局 g
查找所有匹配项,默认只有一个
多行 m
- 多行模式
- 可以对有换行符的字符串进行全局匹配
u
开启完整的 unicode 支持
y
粘滞模式
字符类
数字字符\d
- 任意一个数字(digit)
- \D 取反
空格字符\s
- 空格(space),包括制表符\t,换行符\n 等
- \S 取反
字母字符\w
- 字母(word)
- \W 取反
常规字符 a-z
常规字符可以直接接在正则表达式里
通配符.
- 匹配任何字符(一个)
- 和换行符\n 不能匹配,使用修饰符 s 时可支持,如
"A\nB".match(/A.B/s)
属性缩写字符\p
- 字母(Letter) L:
小写(lowercase) Ll
修饰(modifier) Lm,
首字母大写(titlecase) Lt,
大写(uppercase) Lu,
其它(other) Lo。
- 数字(Number) N:
十进制数字(decimal digit) Nd,
字母数字(letter number) Nl,
其它(other) No。
- 标点符号(Punctuation) P:
链接符(connector) Pc,
横杠(dash) Pd,
起始引用号(initial quote) Pi,
结束引用号(final quote) Pf,
开(open) Ps,
闭(close) Pe,
其它(other) Po。
- 符号(Symbol) S:
货币(currency) Sc,
修饰(modifier) Sk,
数学(math) Sm,
其它(other) So。
- 分隔符(Separator) Z:
行(line) Zl,
段落(paragraph) Zp,
空格(space) Zs。
小写的字母可以写成 \p{Ll},标点符号写作 \p{P} 等等,注意 ie 和火狐可能不支持
其他字符及链接
词边界\b
alert("hello,java!").match(/\bjava\b/); //java
alert("hello,javascript!").match(/\bjava\b/); //null
锚点字符
^
字符串开始
$
字符串结束
转义字符
- 要在字面(意义)上搜索特殊字符 [ \ ^ $ . | ? * + ( ),我们需要在它们前面加上反斜杠 \(“转义它们”)。
- 如果我们在 /…/ 内部(但不在 new RegExp 内部),还需要转义 /。
- 传递一个字符串(参数)给 new RegExp 时,我们需要双倍反斜杠 \,因为字符串引号会消费其中的一个。
集合与范围
集合
比如说,[eao] 意味着查找在 3 个字符 ‘a’、‘e’ 或者 `‘o’ 中的任意一个。
alert("Mop top".match(/[tm]op/gi)); // "Mop", "top"
范围
- 比如说,[a-z] 会匹配从 a 到 z 范围内的字母,[0-5] 表示从 0 到 5 的数字。
- 支持联合范围[0-9a-z],或是联合字符类范围[\d.]
- 排除范围,使用,[0-9]匹配任何除了数字之外的字符
- 在方括号范围内一般不需要进行转义
量词
数量{n}
- 确切位数,如\d{5}表示 5 个数字
- 范围位数,如\d{3,5}表示 3-5 个数字
- 忽略上限,如\d{3,}表示大于 3 个数字
数量缩写
- +代表一个或多个,相当于{1,}
- ?代表一个或 0 个,相当于{0,1}
- *代表 0 个或多个,相当于{0,}
贪婪量词
- 默认启动
- 匹配至最大限度 ,如
"123456".match(/\d{1,}/)
将匹配出["123456"]
懒惰量词
- 使用带问号?的两次启用,
?? | *? | +? | {m,n}?
- 匹配至最小限度,如
"123456".match(/\d{1,}?/g)
将匹配出["1", "2", "3", "4", "5", "6", "7"]
捕获
捕获组
- 使用()将内容包裹起来,令其后量词整组生效,被称作捕获组
捕获组内容获取
- 可以使用
\数字
这种写法来实现分组捕获,如/(\d)([1,2])\1\2/
中,\1
代表第一个捕获组匹配的东西,\2
代表第二个捕获组匹配的东西,\数字
代表的是确切值而不是表达式,如"21312".match(/([1,2])\d*?\1/)
,将匹配"21312"
而非"2131"
- 问号的特殊用法,在组内的最前面使用
?:
时,捕获组将被排除- 问号的特殊用法,在组内的最前面使用
?<name>
时,捕获组将被重命名,可使用\k<name>
捕获,但不影响其原有\数字
选择
使用|将选项隔开
断言
这里的括号不被视为捕获组
前瞻断言
- 语法
x(?=y)
- 后面紧跟的必须是 y,例如
"1 turkey costs 30$".match(/\d+(?=$)/)
,将匹配 30
前瞻否定断言
- 语法
x(?!y)
- 后面紧跟的必须不是 y
后瞻断言
- 语法
(?<=y)x
- 前面紧跟的必须是 y
后瞻否定断言
- 语法
(?<!y)x
- 前面紧跟的必须不是 y
特殊用法整理
^
- 正常为起始符
- 在方括号的起始位置使用代表范围取反
?
- 正常为懒惰量词
- 在捕获组的起始位置配合:使用,
?:
代表忽略该组- 在断言中
?=
为前瞻断言,?!
为前瞻否定断言- 在断言中
?<=
为后瞻断言,?<!
为后瞻否定断言