Plan
1 hour: 正则表达式 30 分钟入门教程
Notes
\b 匹配单词分界处。不匹配分隔符,但是匹配位置。
let reg1 = /\bhi/; // 匹配 h 前面的分隔符,包括空格,标点符号或者换行
reg1.test("hi"); // true
reg1.test("him"); // true
reg1.test("ss hi"); // true
reg1.test("ss.hi"); // true
reg1.test("ss\nhi"); // true
reg1.test("thi"); // false
let reg2 = /\bhi\b/; // 匹配 hi 前后的分隔符,包括空格,标点符号或者换行
reg2.test("hi"); // true
reg2.test("ss.hi.ss"); // true
reg2.test("ss hi ss"); // true
reg2.test("ss\nhi\nss"); // true
reg2.test("him"); // flase
reg2.test("his"); // false
什么叫不匹配分隔符,但是匹配位置?
以下例子,如果是匹配分隔符的话,会将 ".hi." 输出,但是实际上只匹配了 "hi"。这就是只匹配了两个 "." 的位置,然后将这两个 "." 中间的 "hi" 匹配出来。
re2.exec("ss.hi.ss"); // ["hi", index:3, input:"ss.hi.ss"]
元字符表
| 元字符 |
说明 |
| . |
匹配除换行符以外的任意字符 |
| \w |
匹配字母或数字或下划线或汉字 |
| \s |
匹配任意的空白符 |
| \d |
匹配数字 |
| \b |
匹配单词的开始或结束 |
| ^ |
匹配字符串的开始 |
| $ |
匹配字符串的结束 |
常用限定符
| 限定符 |
说明 |
| * |
重复零次或更多次 |
| + |
重复一次或更多次 |
| ? |
重复零次或一次 |
| {n} |
重复 n 次 |
| {n,} |
重复 n 次或更多次 |
| {n,m} |
重复 n 到 m 次 |
反义字符类
| 反义代码 |
说明 |
| \W |
匹配任意不是字母,数字,下划线,汉字的字符 |
| \S |
匹配任意不是空白符的字符 |
| \D |
匹配任意非数字的字符 |
| \B |
匹配不是单词开头或结束的位置 |
| [^x] |
匹配除了 x 以外的任意字符 |
| [^aeiou] |
匹配除了 aeiou 这几个字母以外的任意字符 |
分组
| 分类 |
代码/语法 |
说明 |
| 捕获 |
(exp) |
匹配 exp,并捕获文本到自动命名的组里 |
| (?exp) |
匹配 exp,并捕获文本到名称为 name 的组里,也可以写成(?'name'exp) |
|
| (?:exp) |
匹配 exp,不捕获匹配的文本,也不给此分组分配组号 |
|
| 零宽断言 |
(?=exp) |
匹配 exp 前面的位置 |
| (?<=exp) |
匹配 exp 后面的位置 |
|
| (?!exp) |
匹配后面跟的不是 exp 的位置 |
|
| (?<!exp) |
匹配前面不是 exp 的位置 |
|
| 注释 |
(?#comment) |
这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人阅读 |
懒惰限定符
| 代码/语法 |
说明 |
| *? |
重复任意次,但尽可能少重复 |
| +? |
重复 1 次或更多次,但尽可能少重复 |
| ?? |
重复 0 次或 1 次,但尽可能少重复 |
| {n,m}? |
重复 n 到 m 次,但尽可能少重复 |
| {n,}? |
重复 n 次以上,但尽可能少重复 |
Test
- 匹配注释
var reg = /\/\*[\w\W]*?\*\/|\n?\/\/.*/g;