正则表达式

Yuyang 前端小白🥬

正则表达式

正则表达式是一种用来匹配字符串的强有力的武器。它的设计思想是用一种描述性的语言来给字符串定义一个规则,凡是符合规则的字符串,我们就认为它“匹配”了,否则,该字符串就是不合法的。具有强大的模式匹配和文本检索与替换功能。

正则表达式的定义

在 JavaScript 中,可以通过两种方式定义正则表达式:

  1. 正则表达式字面量: 使用一对斜杠(/)包围正则表达式模式。

    1
    let regex = /pattern/flags;

    例如:

    1
    let regex = /hello/i;
  2. RegExp 构造函数: 使用 RegExp 构造函数来创建正则表达式。

    1
    let regex = new RegExp('pattern', 'flags');

    例如:

    1
    let regex = new RegExp('hello', 'i');

正则表达式的标志(Flags)

正则表达式标志用于修改正则表达式的行为。常见的标志包括:

  • g:全局搜索(global search)。
  • i:不区分大小写搜索(case-insensitive search)。
  • m:多行搜索(multi-line search)。
  • s:允许点号(.)匹配换行符(newline characters)。
  • u:启用 Unicode 匹配。
  • y:粘性匹配(sticky search),从目标字符串的当前位置开始匹配。

常用的正则表达式方法

1、**test()**: 测试字符串中是否存在与正则表达式模式匹配的文本,返回布尔值。

1
2
3
let regex = /hello/;
let result = regex.test('hello world');
console.log(result); // true

2、**exec()**: 搜索字符串中与正则表达式模式匹配的文本,返回一个结果数组或 null

1
2
3
let regex = /hello/;
let result = regex.exec('hello world');
console.log(result); // ["hello"]

正则表达式的基本模式

字符类

  • .:匹配除换行符外的任何单个字符。
  • \d:匹配一个数字(0-9)。
  • \D:匹配一个非数字字符。
  • \w:匹配一个字母、数字或下划线字符。
  • \W:匹配一个非字母、数字或下划线字符。
  • \s:匹配一个空白字符(包括空格、制表符等)。
  • \S:匹配一个非空白字符。

边界匹配

  • ^:匹配字符串的开始。
  • $:匹配字符串的结束。
  • \b:匹配单词边界。
  • \B:匹配非单词边界。

量词

  • *:匹配前一个字符 0 次或多次。
  • +:匹配前一个字符 1 次或多次。
  • ?:匹配前一个字符 0 次或 1 次。
  • {n}:匹配前一个字符恰好 n 次。
  • {n,}:匹配前一个字符至少 n 次。
  • {n,m}:匹配前一个字符至少 n 次,但不超过 m 次。

什么是贪婪匹配和非贪婪匹配

贪婪匹配

贪婪匹配(Greedy Matching) 会尽可能多地匹配字符。这是正则表达式的默认行为。

例如,考虑以下正则表达式和字符串:

1
2
3
4
let regex = /a.*b/;
let str = "aabab";
let match = str.match(regex);
console.log(match[0]); // "aabab"

在这个例子中,.* 是贪婪的,它会尝试匹配尽可能多的字符,以使整个表达式匹配成功。因此,它从第一个 a 开始,直到最后一个 b 才停止匹配。

在正则表达式中,“贪婪匹配”和“非贪婪匹配”是用于描述重复量词(如 *, +, ?, {})的两种不同行为。

贪婪匹配

贪婪匹配(Greedy Matching) 会尽可能多地匹配字符。这是正则表达式的默认行为。

例如,考虑以下正则表达式和字符串:

1
2
3
4
5
6
javascript
复制代码
let regex = /a.*b/;
let str = "aabab";
let match = str.match(regex);
console.log(match[0]); // "aabab"

在这个例子中,.* 是贪婪的,它会尝试匹配尽可能多的字符,以使整个表达式匹配成功。因此,它从第一个 a 开始,直到最后一个 b 才停止匹配。

非贪婪匹配

非贪婪匹配(Non-Greedy Matching),也称为“懒惰匹配(Lazy Matching)”,会尽可能少地匹配字符。使用 ? 来表示非贪婪匹配。

例如,考虑以下正则表达式和字符串:

1
2
3
4
let regex = /a.*?b/;
let str = "aabab";
let match = str.match(regex);
console.log(match[0]); // "aab"

在这个例子中,.*? 是非贪婪的,它会尽可能少地匹配字符。因此,它从第一个 a 开始,匹配到第一个 b 就停止匹配。