正则表达式入门规则及语法 笔记
语法
构造函数方法:
regexp = new RegExp("pattern", "flags"); // flags指定修饰符
字面量方法:
regexp = /pattern/; // 没有修饰符
regexp = /pattern/gmi; // 伴随修饰符 g、m 和 i
表达式和字符串方法
| 表达式 | 参数 | 返回值 |
|---|---|---|
| str.match(regexp) | 要匹配的模式的 RegExp | Array |
| str.search(regexp) | 要匹配的模式的 RegExp | 返回第一个匹配项的位置,如果未找到,则返回 -1 |
| str.replace(arg1, arg2) | 子字符串或要替换的模式的 RegExp | String |
| regexp.test(str) | regexp:匹配规则,str:要匹配的字符串 | Boolean |
几个简单的例子:
let str = "I love JavaScript";
let result = str.match(/Java(Script)/g);
alert( result[0] ); // JavaScript
alert( result.length ); // 1
let str = "awesome";
alert( str.search( /om/i ) ); // 4(第一个匹配位置)
// 将连字符替换为冒号
alert( '12-34-56'.replace( /-/g, ":" ) ) // 12:34:56
let str = "I love Eating";
// 这两个测试结果相同
alert( /love/i.test(str) ); // true
alert( str.search(/love/i) != -1 ); // true
修饰符
| 修饰符 | 解释 |
|---|---|
| i | 不区分大小写: 例如A 和 a 没有区别 |
| g | 查找所有的匹配项,而不只是第一个。 |
| m | 多行模式 |
| u | 开启完整的 unicode 支持 |
| y | 粘滞模式 |
元字符
作为对比,这里分为字符类和反向类:
| 字符类 | 描述 | 反向类 | 描述 | |
|---|---|---|---|---|
| \d | “d” 来自 “digit”,数字从 0 到 9 的字符 | \D | 非数字:除 \d 以外的任何字符 | |
| \s | “s” 来自 “space”,匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。 | \S | 非空格符号:除 \s 以外的任何字符 | |
| \w | “w” 来自 “word”,字母或数字或下划线 _ | \W | 非单字字符:除 \w 以外的任何字符,例如非拉丁字母或空格。 | |
| . | 点(.)匹配除换行符之外的任何字符 | |||
| ^ | 匹配字符串的开始位置 | |||
| $ | 匹配字符串的结束位置 | |||
| \ | 转义字符 | |||
| \b | 词边界(下面详细写) |
“m” - 多行模式下的^和$
行的开头
^和行的结尾$开启多行模式的行为是相似的,这里仅以行开头为例。
在有多行文本的字符串中,正则表达式/^\d+/gm 将匹配每一行的开头数字:
let str = `1心一意
7上八下
10全十美`;
alert( str.match(/^\d+/gm) ); // 1, 7, 10
没有开启多行模式的情况下,仅仅是第一个数字被匹配到:
let str = `1心一意
7上八下
10全十美`;
alert( str.match(/^\d+/g) ); // 1
词边界\b
有三种不同的位置可作为词边界:
- 在字符串开头,如果第一个字符是单词字符
\w。 - 在字符串中的两个字符之间,其中一个是单词字符
\w,另一个不是。 - 在字符串末尾,如果最后一个字符是单词字符
\w。
例如,可以在 Hello, Toufa! 中找到匹配 \bToufa\b 的单词,其中 Toufa 是一个独立的单词,而在 Hello, ToufaNongmi! 中则不行。
alert( "Hello, Toufa!".match(/\bHello\b/) ); // Hello
alert( "Hello, Toufa!".match(/\bToufa\b/) ); // Toufa
alert( "Hello, Toufa!".match(/\bHell\b/) ); // null (no match)
alert( "Hello, Toufa!".match(/\bToufa!\b/) ); // null (no match)
alert( "Hello, ToufaNongmi!".match(/\bToufa\b/) ); // null
集合和范围 - 大括号{}、中括号[]
在方括号 […] 中的几个字符或者字符类意味着“搜索给定的字符中的任意一个”。
一个中括号只能匹配一个字符
集合
比如说,[qwe] 意味着查找在 3 个字符 'q'、'w' 或者 'e' 中的任意一个。
范围
方括号也可以包含字符范围。
alert( "Reply1988".match(/l[0-9A-F][0-9A-F]/g) ); // ly1
排除范围
除了普通的范围匹配,还有类似 [^…] 的“排除”范围匹配。
[^aeyo]—— 匹配任何除了 'a'、'e'、'y' 或者 'o' 之外的字符。[^0-9]—— 匹配任何除了数字之外的字符,也可以使用 \D 来表示。[^\s]—— 匹配任何非空字符,也可以使用 \S 来表示。
捕获组 - 小括号()
- 它允许将匹配的一部分作为结果数组中的单独项。
- 如果我们将量词放在括号后,则它将括号视为一个整体。
alert( 'Gogogo now!'.match(/(go)+/i) ); // "Gogogo"
// 实例email
let regexp = /[-.\w]+@([\w-]+\.)+[\w-]+/g;
alert("my@mail.com @ his@site.com.uk".match(regexp)); // my@mail.com, his@site.com.uk
量词 + * ?
n 和 m 为非负整数
| 量词 | 描述 |
|---|---|
| {n} | 确切的位数 |
| {n,m} | 某个范围的位数 |
| {n,} | 省略上限的位数 |
| + | 代表“一个或多个”,相当于 {1,} |
| ? | 代表“零个或一个”,相当于 {0,1} |
| * | 代表着“零个或多个”,相当于 {0,} |
选择(or) |
先上一个例子:
let reg = /pen|apple|pineapple|Pineapples/gi;
let str = "I have a pen,I have an apple,I have a pineapple";
alert( str.match(reg) ); // 'pen', 'apple', 'pineapple'
- 方括号: 允许在许多字符中进行选择,例如 gr[ae]y 匹配 gray 或 grey。
选择符号并非在字符级别生效,而是在表达式级别。
例如:
gr(a|e)y严格等同gr[ae]y。gra|ey匹配 “gra” 或者 “ey”。
前瞻断言 和 后瞻断言
| 肯定语法 | 描述 | 否定语法 | 描述 | |
|---|---|---|---|---|
| 前瞻断言 | x(?=y) | 匹配 x, 仅在后面是 y 的情况。 | x(?!y) | 匹配 x, 仅在后面不是 y 的情况。 |
| 后瞻断言 | (?<=y)x | 匹配 x, 仅在前面是 y 的情况。 | (?<=y)x | 匹配 x, 仅在前面不是 y 的情况。 |
神秘的网址
进入下面网址,把正则复制进去,自动生成图谱,方便理解。