正则表达式是一种描述字符规则的迷你语言,它由普通字符和元字符组成。
普通字符
没有显式指定为元字符的所有可打印和不可打印字符,包括所有大写和小写字母、所有数字、所有标点符号和一些其他符号。
javascript
const str = 'abcderfgearshdf';
const regex = /fgea/;
console.log(regex.test(str)); // true
console.log(str.match(regex)); // ['fgea', index: 6, input: 'abcderfgearshdf', groups: undefined] 测试浏览器 Chrome 157.0.8103.39
console.log(str.match(regex)[0]); // 'fgea'
元字符
正则表达式中的元字符是具有特殊含义的字符,它们不表示字面意义,而是用于控制匹配模式。
| 功能分类 | 元字符/语法 | 含义与示例 |
|---|---|---|
| 任意字符匹配 | . |
匹配除换行外任意一个字符;是否匹配换行受 s/DOTALL 影响 |
| 字符类 | [...] |
字符集合,如 [abc] 匹配 a/b/c |
[^...] |
否定字符类,如 [^0-9] 匹配非数字 |
|
- |
在字符类中表示范围,如 [a-z];放首尾或转义可表示字面量 |
|
| 预定义字符类 | \d / \D |
数字 / 非数字 |
\w / \W |
单词字符 / 非单词字符 | |
\s / \S |
空白字符 / 非空白字符 | |
\p{...} / \P{...} |
Unicode 属性类 / 其否定,如 \p{L} 字母 |
|
| 量词/重复 | * |
0 次或多次 |
+ |
1 次或多次 | |
? |
0 次或 1 次 | |
{m} |
恰好 m 次 | |
{m,} |
至少 m 次 | |
{m,n} |
m 到 n 次 | |
| 懒惰/贪婪/占有量词 | *?、+?、??、{m,n}? |
懒惰匹配,尽量少 |
*+、++、?+、{m,n}+ |
占有量词,不回溯(部分引擎支持) | |
| 位置锚点 | ^ |
行/字符串开头,取决于多行模式 |
$ |
行/字符串结尾,取决于多行模式 | |
\b / \B |
单词边界 / 非单词边界 | |
\A |
字符串开头(部分引擎) | |
\Z / \z |
字符串结尾/最终结尾(引擎差异) | |
\G |
上一次匹配结束位置(部分引擎) | |
| 选择/分支 | ` | ` |
| 分组 | (...) |
捕获分组 |
(?:...) |
非捕获分组 | |
(?<name>...) 或 (?P<name>...) |
命名捕获分组,语法因引擎而异 | |
(?>...) |
原子分组,禁止回溯(部分引擎) | |
| 环视/断言 | (?=...) |
正向先行断言 |
(?!...) |
负向先行断言 | |
(?<=...) |
正向后行断言 | |
(?<!...) |
负向后行断言 | |
| 反向引用 | \1、\2... |
引用第 n 个捕获组 |
\k<name> |
引用命名捕获组,语法因引擎而异 | |
| 转义 | \ |
转义元字符,如 \. 匹配字面点号 |
\Q...\E |
引号内按字面量处理(部分引擎) | |
| 内联模式修饰 | (?i)、(?m)、(?s) 等 |
开启/关闭忽略大小写、多行、点匹配换行等(非严格"元字符") |
注意: 若需要使用元字符字面量匹配,必须使用转移字符处理,否则无法匹配
javascript
const a = "3.1415";
const regex = /./;
console.log(a.match(regex)); // ['3', index: 0, input: '3.1415', groups: undefined]
const regex2 = /\./;
console.log(a.match(regex2)); // ['.', index: 1, input: '3.1415', groups: undefined]