正则基础

文章目录

正则基础

重新整理一下正则知识。

String.match(RegExp) 字符串匹配正则方法 match,如果匹配成功,会返回一个数组,第一项表示整个正则 (regexp) 匹配到的内容,其余表示所有捕获组。匹配不成功返回 null。

match 返回的这个数组上有几个自定义属性:

  • input 表示被用于匹配的整个字符串。
  • index 表示被匹配到的字符串在整个字符串的位置。
  • groups 表示自定义名称的捕获组,如果没有对捕获组定义自定义名称,得到 undefined。否则为一个对象。

捕获

() 匿名捕获组,如果在 /(这里)/ 被匹配到,会返回到 match 得到的数组中,在字符串的 replace 方法中,可以用 $n 来表示第几个捕获组,n 从 1 开始,表示第一个捕获组。

(?:) 非捕获组,如果在 /(?:)/ 被匹配到,也不会返回到 match 得到的数组中,但正则仍然需要匹配到它,只是不返回到数组中。

(?<name>) 具名捕获组,replace 中可以用 $<name> 来取得匹配内容替换的字符串。

环视断言

(?<后顾)X(?前瞻),前瞻后顾是相对与 X 来讲的,X 在前面就是前瞻,X在后面就是后顾。

注意:断言不会消耗匹配内容,仅仅起到条件匹配作用。

模式 类型 匹配
x(?=y) 前瞻肯定断言 匹配 y 前的 x
x(?!y) 前瞻否定断言 匹配不在 y 前的 x
(?<=y)x 后顾肯定断言 匹配在 y 后的 x
(?<!y)x 后顾否定断言 匹配不在 y 后的 x

例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
'a123b'.match(/a(?<=a)(?<first>1)(?:(2)3)(?=b)b/)

/*
0: "a123b"
1: "1"
2: "2"
groups:
first: "1"
index: 0
input: "a123b"

分析:
/a(?<=a)/ 表示后顾断言,(?<=a) 表示下一位前必须是 a,而前面 (?<=a) 前面也确实是 a,如果写成 /b(?<=a)/,这种后顾断言,就不可能会匹配到任何东西,因为下一位的前面由后顾断言决定必须是 a,但正则中的前一位又必须匹配 b,导致矛盾,不可能匹配。记住断言是不会消耗匹配内容的,你可以将它当成一个摆设,如果匹配上了,甚至可以忽略它。
/(?<first>1)/ 表示具名捕获组,名称会 first,被放入 groups,同时被捕获的数组中也会存在。
/(?:(2)3)/ 表示非捕获组,虽然需要匹配,但不会被计入到捕获组中,忽略外层的 3,但里面的 2 仍然需要计入捕获组。
/(?=b)b/ 前瞻断言,同理,前一位的后面必须是 b,否则不匹配,(?=b) 在匹配成功后其实可以忽略。如果写成 /(?=b)a/ 同样由于矛盾不可能匹配到任何内容。
*/
分享到:

评论完整模式加载中...如果长时间无法加载,请针对 disq.us | disquscdn.com | disqus.com 启用代理