Skip to content

正则表达式语法

在 JavaScript 中,正则表达式(RegExp)是用于匹配字符串中字符组合的模式。以下是核心语法详解:


一、创建正则表达式

  1. 字面量形式(推荐):

    javascript
    const regex = /pattern/flags;
    • 例:/ab+c/i(匹配 "abc"、"AbC" 等,忽略大小写)
  2. 构造函数形式

    javascript
    const regex = new RegExp('pattern', 'flags');
    • 例:new RegExp('ab+c', 'i')(动态生成时常用)

二、修饰符(Flags)

标志作用示例
i不区分大小写/test/i 匹配 "Test"
g全局匹配(所有结果)/a/g 匹配所有 "a"
m多行模式(^$匹配每行开头结尾)/^a/gm 匹配每行开头的 "a"
s允许.匹配换行符(ES2018+)/a.b/s 匹配 "a\nb"
uUnicode 模式(处理 UTF-16)/𠮷/u 匹配 Unicode 字符
y粘滞模式(从lastIndex开始匹配)/a/y 连续匹配时使用

三、元字符与字符类

语法含义
.匹配除换行符外的任意字符(启用s时包含换行符)
\d数字(等价于 [0-9]
\D非数字(等价于 [^0-9]
\w单词字符(字母、数字、下划线,等价于 [A-Za-z0-9_]
\W非单词字符
\s空白符(空格、制表符、换行等)
\S非空白符
[abc]匹配 a、b 或 c 中的任意一个字符
[^abc]匹配除 a、b、c 外的任意字符
[a-z]匹配 a 到 z 范围内的字符

四、量词(重复匹配)

语法含义示例
a*0 次或多次/bo*/ 匹配 "b"、"boo"
a+1 次或多次/a+/ 匹配 "a"、"aa"
a?0 次或 1 次(可选)/e?le?/ 匹配 "el"、"le"
a{3}精确匹配 3 次/a{3}/ 匹配 "aaa"
a{3,}至少 3 次/a{3,}/ 匹配 "aaa"、"aaaa"
a{3,5}3 到 5 次/a{3,5}/ 匹配 "aaa"、"aaaaa"
a*?非贪婪模式(匹配最小可能)/".*?"/ 匹配 "foo" 而非整个 "foo" bar"

五、分组与捕获

  1. 捕获分组 ( )

    javascript
    '2023-01-01'.match(/(\d{4})-(\d{2})-(\d{2})/);
    // 结果: ["2023-01-01", "2023", "01", "01"]
    • 通过索引获取分组:result[1]"2023"
  2. 非捕获分组 (?: )

    javascript
    'abc'.match(/(?:a)(b)(c)/);
    // 结果: ["abc", "b", "c"](不捕获 "a")
  3. 命名分组 (?<name>)(ES2018+):

    javascript
    const { groups } = '2023-01-01'.match(/(?<year>\d{4})-(?<month>\d{2})/);
    console.log(groups.year); // "2023"

六、边界匹配

语法含义
^字符串/行的开始(多行模式)
$字符串/行的结束(多行模式)
\b单词边界
\B非单词边界

示例:

javascript
// 匹配独立的单词 "test"
/\btest\b/.test('this is a test'); // true

七、断言(Lookaround)

语法名称作用
x(?=y)正向肯定断言匹配后面是 y 的 x
x(?!y)正向否定断言匹配后面不是 y 的 x
(?<=y)x反向肯定断言匹配前面是 y 的 x
(?<!y)x反向否定断言匹配前面不是 y 的 x

示例:

javascript
// 匹配后面是 " dollars" 的数字
/\d+(?= dollars)/.exec('100 dollars'); // ["100"]

// 匹配前面是 "$" 的数字
/(?<=\$)\d+/.exec('$100'); // ["100"]

八、常用方法

  1. test():检测是否匹配

    javascript
    /abc/.test('abcdef'); // true
  2. exec():返回匹配结果(含分组)

    javascript
    /a(b)c/.exec('abc'); // ["abc", "b", index:0, ...]
  3. 字符串方法

    javascript
    'abc'.match(/a(b)c/);    // 同 exec()
    'abc'.replace(/a/, 'x'); // "xbc"
    'a,b,c'.split(/,/);      // ["a", "b", "c"]
    'abc'.search(/b/);       // 返回位置 1

九、特殊转义

  • 匹配元字符需转义:[ ] \ ^ $ . | ? * + ( ) { }
    javascript
    /\.com/.test('example.com'); // true(匹配 ".")
  • Unicode 字符:\u{1F4A9}(启用 u 标志)
    javascript
    /\u{1F4A9}/u.test('💩'); // true

十、示例综合

javascript
// 匹配电子邮件
const emailRegex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
emailRegex.test('user@example.com'); // true

// 提取日期中的年月(命名分组)
const { year, month } = '2023-12-31'.match(
  /(?<year>\d{4})-(?<month>\d{2})/
).groups;

掌握这些核心语法,即可高效处理 JavaScript 中的文本匹配任务!