正则

说起正则,就头大,怎么看也云里雾里。它对我来说就像一座山,走到山脚下都极其费力,更别说要登上这座山,征服它,做梦…

实在是那些特殊字符的含义读起来简直就像一门外星语…

哎,总之,古人说,锲而不舍,朽木可琢。只要一步一步走,总能到山脚下,一步一步爬,总能登顶,虽难登,征服它却也不是不可能。白日梦者梦白日,总有做不完的梦,和到的了的目标。

以下内容整理自 MDN 正则表达式

正则的构建方式

  1. 字面量(推荐使用)
    包含在斜杠之间的模式组成:
    1
    2
    3
    const regex = /ab+c/;

    const regex = /^[a-zA-Z]+[0-9]*\W?_$/gi;

⚠️注意:在加载脚本后,使用此方法可获得更好的性能。

  1. RegExp 对象的构造函数
    1
    2
    3
    4
    5
    let regex = new RegExp("ab+c");

    let regex = new RegExp(/^[a-zA-Z]+[0-9]*\W?_$/, "gi");

    let regex = new RegExp("^[a-zA-Z]+[0-9]*\\W?_$", "gi");

正则表达式中的特殊字符

MDN正则表达式中的特殊字符

字符 含义
\ 1. 匹配边界字符 参见:\b 规则;
2. 转义字符。
^ 匹配输入的开始。如果多行标志被设置为true,那么也匹配换行符后紧跟的位置。
$ 匹配输入的结束。如果多行标示被设置为true,那么也匹配换行符前的位置。
* 匹配前一个表达式0次或多次。等价于 {0,}
+ 匹配前面一个表达式1次或者多次。等价于 {1,}
? 1. 匹配前面一个表达式0次或者1次。等价于 {0,1}
2. 如果紧跟在任何量词 *、 +、? 或 {} 的后面,将会使量词变为非贪婪的(匹配尽量少的字符),和缺省使用的贪婪模式(匹配尽可能多的字符)正好相反。
3. 还可以运用于先行断言,如本表的 x(?=y)x(?!y) 条目中所述。
. (小数点)匹配除换行符之外的任何单个字符。
(x) 匹配 ‘x’ 并且记住匹配项,就像下面的例子展示的那样。括号被称为 捕获括号。
(?:x) 匹配 ‘x’ 但是不记住匹配项。这种叫作非捕获括号,使得你能够定义为与正则表达式运算符一起使用的子表达式。
x(?=y) 匹配’x’仅仅当’x’后面跟着’y’.这种叫做正向肯定查找。
x(?!y) 匹配’x’仅仅当’x’后面不跟着’y’,这个叫做正向否定查找。
x竖线y 匹配‘x’或者‘y’。
{n} n是一个正整数,匹配了前面一个字符刚好发生了n次。
{n,m} n 和 m 都是整数。匹配前面的字符至少n次,最多m次。如果 n 或者 m 的值是0, 这个值被忽略。
[xyz] 一个字符集合。匹配方括号的中任意字符,你可以使用破折号(-)来指定一个字符范围。
[^xyz] 一个反向字符集。也就是说, 它匹配任何没有包含在方括号中的字符。
[\b] 匹配一个退格(U+0008)。(不要和\b混淆了。)
\b 匹配一个词的边界。
例如:/\bm/匹配“moon”中得‘m’;/oo\b/并不匹配”moon”中得’oo’,因为’oo’被一个“字”字符’n’紧跟着。
\B 匹配一个非单词边界。
\cX 当X是处于A到Z之间的字符的时候,匹配字符串中的一个控制符。
例如,/\cM/ 匹配字符串中的 control-M (U+000D)。\
\d 匹配一个数字。
等价于 [0-9]
\D 匹配一个非数字字符。
等价于 [^0-9]\
\f 匹配一个换页符 (U+000C)。
\n 匹配一个换行符 (U+000A)。
\r 匹配一个回车符 (U+000D)。
\s 匹配一个空白字符,包括空格、制表符、换页符和换行符。
等价于[\f\n\r\t\v\u00a0\u1680\u180e\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]
\S 匹配一个非空白字符。
等价于 [^\f\n\r\t\v\u00a0\u1680\u180e\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]
\t 匹配一个水平制表符 (U+0009)。
\v 匹配一个垂直制表符 (U+000B)。
\w 匹配一个单字字符(字母、数字或者下划线)。
等价于 [A-Za-z0-9_]
\W 匹配一个非单字字符。
等价于 [^A-Za-z0-9_]
\n 在正则表达式中,它返回最后的第n个子捕获匹配的子字符串(捕获的数目以左括号计数)。
\0 匹配 NULL (U+0000) 字符, 不要在这后面跟其它小数,因为 \0 是一个八进制转义序列。
\xhh 与代码 hh 匹配字符(两个十六进制数字)。
\uhhhh 与代码 hhhh 匹配字符(四个十六进制数字)。
\u{hhhh} (仅当设置了u标志时) 使用Unicode值hhhh匹配字符 (十六进制数字).

熟读特殊符号的规则,大部分正则都可以看懂,就好比汉语拼音,熟知声、韵母的组合规则,就能熟练的读出汉语。


使用正则表达式

方法 描述
exec 一个在字符串中执行查找匹配的 RegExp 方法,它返回一个数组(未匹配到则返回null)。

语法 regex.test(str)
test 一个在字符串中测试是否匹配的 RegExp 方法,它返回 truefalse

语法 regex.test(str)
match 一个在字符串中执行查找匹配的 String 方法,它返回一个数组或者在未匹配到时返回 null

语法 str.match(regex)
search 一个在字符串中测试匹配的 String 方法,它返回匹配到的位置索引,或者在失败时返回 -1

语法 str.search(regex)
replace 一个在字符串中执行查找匹配的 String 方法,并且使用替换字符串替换掉匹配到的子字符串。

语法 str.replace(regexp/substr, newSubStr/function)
split 一个使用正则表达式或者一个固定字符串分隔一个字符串,并将分隔后的子字符串存储到数组中的 String 方法。

语法 str.split(regex)

testsearch 能够快速匹配一个字符串,匹配到返回 true,否则返回 false

execmatch 能够返回更多信息(比较慢),匹配成功返回一个数组并且更新相关的正则表达式对象的属性和预定义的正则表达式对象,未匹配到则返回 null (也就是 false)。


正则表达式标志

标志 描述
g 全局搜索。
i 不区分大小写搜索。
m 多行搜索。
y 执行“粘性”搜索,匹配从目标字符串的当前位置开始,可以使用y标志。

包含一个标志的正则表达式:

1
2
3
4
5
var re = /pattern/flags;

// or

var re = new RegExp("pattern", "flags");