js正则小结

1,\
斜杠用于转义,在js正则里,只有一些元字符(*,?,.等)和\本身需要转义,其他的不需要转义,如果其他的字符前面使用了\,可能会产生负面影响,比如\b,\t这些有特殊含义的转义。
此外,在js正则中,\还有一个用处在于使用new RegExp()形式创建正则对象时,比如new RegExp('a\*a'),其中*是乘以的意思,js引擎在解析该正则表达式字符串时,会消耗掉这个斜杠,最后生成的是a*a,这时候我们要这样写'a\\*a'。
2 ^
该元字符比较简单,就是表示该正则是从字符串的首字符开始匹配的,有一个地方需要注意的是,如果该正则表达式加了m标记时,匹配到了行分隔符的时候就会结束。然后会在下一行继续匹配。
'd\nd'.match(/^d/g)    => ['d'], 'd\nd'.match(/^d/mg) =>  ["d", "d"]
3 $
该元字符和^一样,当含义$的正则匹配一个字符串时,他不是直接判断该字符串的结尾,而是以行结束符为分隔,对每一行的结尾进行匹配。
'd\nd'.match(/d$/g)     => ['d'], 'd\nd'.match(/d$/mg)     = > ["d", "d"]
4 * + ?
这三个元字符代表的是匹配0到多个同样的字符组合,a*,a?,a+,分别代表匹配0到多个a,0到1个a,1到多个a。这是一种贪婪的匹配,也就是尽可能多地匹配后面符合条件的字符。
如果在这些元字符后面加上?,那么就代表是非贪婪匹配,也就是尽可能少地匹配。{n,m}和以上的情况类似,也可以在后面加?。
'ddd'.match(/d{1,11}/)    => ddd, 'ddd'.match(/d{1,11}?/) => d。
5 .
匹配除了行分隔符外的所有字符
6 捕获分组(x) \n $n RegExp.$n
()代表捕获分组,x代表的表达式所匹配的内容可以在x所有的正则中或者其他地方使用。
/(x)(y)\1\2/.test('xyxy') => true  /(x)(y)\1\2/.test('xyyy') => false,\n代表的是第n个捕获分组的值。
'xy'.replace(/(x)(y)/, "$1 and $2 ") => x and y, RegExp.$1 = x, RegExp.$2 = y,每次正则执行完后,捕获分组或挂载到RegExp对象上,并且清除上次执行的结果。
$&是一个特殊的变量,他代表是整个正则表达式匹配到的结果。也就是xy。
7 (?:x)
非捕获分组,也就是()中的表达式捕获到分组不可在其他地方使用。'x'.replace(/(?:x)/, "$1") => "$1"
8 x(?=y)
前向断言,断言x后面是y,但y不在捕获分组中,'x'.match(/x(?=y+)/) => null, 'xyy'.match(/x(?=y+)/) => x
9 x(?!y)
同上,断言x后面不是y。
10 [\b]
匹配(U+0008),键盘中的退格键。
11 \b
匹配单词的边界,如果匹配成功,匹配到内容的结果长度为0,单词边界的定义为,某一个位置,后面或者前面没有单词字符,则是单词边界。其中单词字符的定义为大小写字母+数字+_。其余的都为非单词字符。
/a\b/.test('a~b') => true,~被视为单词边界。/a\b/.test('ab') => false
12 \B
分单词边界,定义类似\b。/a\B/.test('ab') => true, /b\B/.test('ab')  => false,b的后面是'',属于单词边界,所以是false。
13 \w
单词字符,定义为[A-Za-z0-9_]
14 \W
非单词字符,定义为[^A-Za-z0-9_]
15 \s
所有空格,如制表符、垂直分隔符、水平分隔符,定义为[ \f\n\r\t\v\u00a0\u1680\u180e\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]。
16 \S
非空格符,定义为[^ \f\n\r\t\v\u00a0\u1680\u180e\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]。
17 sticky
粘着位类似于全局匹配,当我们使用exec函数时,如果正则表达式中加了g,那么就会下次执行exec函数时就会从上次匹配的结束位置开始。
同样,我们可以通过加y标记来达到这个目的。
var x = /a/; x.exec('aa'), x.exec('aa'); lastIndex为上次匹配的位置,lastIndex为不会变,每次都匹配到第一个a
var x = /a/g; x.exec('aa'), x.exec('aa'); lastIndex会变,第n次匹配会匹配到第n个a
var x = /a/y; x.exec('aa'), x.exec('aa'); lastIndex会变,第n次匹配会匹配到第n个a,粘着位其实就是说上次匹配的位置会粘着(记着)
18 使用new RegExp()
动态生成正则时需要使用这种方式,但是需要对输入进行转义。需要对元字符进行修正,$&为每次匹配到的字符
function fix(str) {
  return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
}

原文发布于微信公众号 - 编程杂技(theanarkh)

原文发表时间:2019-02-25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券