JavaScript 正则表达式

正则表达式是一种强大的文本处理工具,可以用来匹配、查找和替换指定的文本模式。在 JavaScript 中,正则表达式是一种特殊类型的对象,也支持使用正则表达式字面量或者 RegExp 构造函数来创建和使用正则表达式。

正则表达式的基本语法

创建正则表达式

在 JavaScript 中,可以使用两种方式来创建正则表达式:

  • 字面量形式:使用 / 开始和结束,例如 /pattern/flags
  • 构造函数形式:使用 new RegExp(pattern, flags),其中 pattern 是正则表达式模式字符串,flags 是可选的标志字符串。

举个例子,下面是一个匹配数字的简单正则表达式:

1
2
3
4
5
// 使用字面量形式创建正则表达式
const digitRegex = /\d+/;

// 使用构造函数形式创建正则表达式
const digitRegex = new RegExp("\\d+");

需要注意的是,使用正则表达式时,反斜杠 \ 是一个特殊字符,表示转义。因此,在字面量形式中,如果希望匹配反斜杠本身,需要使用双反斜杠 \\ 表示;而在构造函数形式中,则需要使用四个反斜杠 \\\\ 表示。

匹配模式和元字符

正则表达式由基本字符和元字符组成。其中,基本字符表示普通字符,而元字符则具有特殊含义。

以下是一些常见的元字符:

  • . :点代表匹配除了换行符\n\r\v\f之外的任何单个字符。
  • ^ :脱字符号表示匹配输入的开始在多行模式中匹配每一行的开始。
  • $ :美元符号表示匹配输入的结尾在多行模式中匹配每一行的结尾。
  • * :星号表示匹配前面的子表达式零次或多次,即允许出现零次。
  • + :加号表示匹配前面的子表达式一次或多次。
  • ? :问号表示匹配前面的子表达式零次或一次,即允许出现零次或一次。
  • | :管道符号代表“或”的意思,多个子表达式通过|连接的时候可以选择其中任意一个匹配对象。
  • [] :方括号中间放任意字符,表示匹配方括号中的任一字符,并且只能匹配一个。
  • () :小括号中间是正则表达式,表示匹配括号内的整个正则表达式,也可以用于分组。
  • \d :表示数字字符。等价于 [0-9]
  • \D :表示非数字字符。等价于 [^0-9]
  • \w :表示任何字母数字字符,包括下划线。等价于 [A-Za-z0-9_]
  • \W :表示非单词字符,包括符号和空格等。等价于 [^A-Za-z0-9_]
  • \s :表示空白字符,包括空格、制表符和换行符等。等价于[\f\n\r\t\v]
  • \S :表示非空白字符。等价于 [^\f\n\r\t\v]

以下是一些使用正则表达式的示例:

1
2
3
4
5
6
7
8
9
var patt1 = /hello/g;
var patt2 = new RegExp("world", "gi");
var str1 = "Hello World";
var str2 = "This is a test string.";

console.log(patt1.test(str1)); // true
console.log(str1.match(patt2)); // ["World"]
console.log(str2.search(/test/)); // 10
console.log(str1.replace(/world/i, "friend")); // "Hello friend"

匹配标志

正则表达式的匹配标志可以改变正则表达式的行为,例如:

  • i 表示忽略大小写;
  • g 表示全局匹配模式,匹配到第一个结果之后继续查找;
  • m 表示多行匹配模式,使得 ^$ 符号可以分别匹配文本的开头和结尾,而非仅匹配整个字符串的开头和结尾。

以下是使用匹配标志的示例,其中 /g 标志用来查找所有数字:

1
2
3
4
5
6
7
const text = "The quick brown fox jumps over the lazy dog 123 times!";
const digitRegex = /\d+/g;

let match;
while ((match = digitRegex.exec(text))) {
console.log(`Match found at position ${match.index}: "${match[0]}"`);
}

结果输出如下:

1
Match found at position 39: "123"

特殊字符和转义符

有些特殊的字符在正则表达式中有特别的含义,它们被称为元字符,如果需要匹配这些字符本身,则需要使用转义符 \。一些常用的特殊字符包括:

  • ()[].*+^${}:表示某些特定功能的字符,需要在前面加上转义符才能匹配这些字符本身。
  • \ :作为转义符,可以将特殊字符转义成字面量。

例如,如果想要匹配文本中的一个点号,应该使用转义符 \.;如果想要匹配括号中的内容,应该使用小括号(即 ())将要匹配的部分圈起来,并在最前面加上反斜杠 (即 \(\)):

1
2
3
4
5
6
7
var pattern = /\d+\.\d+/g;
var str = "The prices are: $4.99, $9.89, $321.67";
console.log(str.match(pattern)); // ["4.99", "9.89", "321.67"]

var pattern2 = /\(.*\)/g;
var str2 = "The (quick) brown (fox) jumps over the lazy dog.";
console.log(str2.match(pattern2)); // ["(quick)", "(fox)"]

正则表达式的高级用法

分组和引用

在正则表达式中,可以使用圆括号 ( ) 来进行模式分组,并且使用数字或名称来引用已匹配的子串。以下是一个示例:

1
2
3
4
5
6
const zipCodeRegex = /^(\d{5})(?:[ -](\d{4}))?$/;
const zipCode = "90210-1234";

const matches = zipCode.match(zipCodeRegex);
console.log(matches[1]); // "90210"
console.log(matches[2]); // "1234"

在上面的示例中,使用正则表达式匹配邮编,并将邮政编码的前 5 位和后 4 位分别放置于第一组和第二组中。其中 \d{5} 表示匹配 5 个数字字符,而 (?:[ -](\d{4}))? 则表示匹配可选的后 4 位数字或空格(其中 (?:...) 表示非捕获分组,即只匹配但不作为结果输出)。

替换和函数回调

在 JavaScript 中,可以使用 String.prototype.replace() 方法来进行正则表达式替换。通常情况下,字符串替换的语法如下:

1
const result = inputString.replace(regex, replacementString);

其中 regex 是正则表达式模式,replacementString 是用来替换匹配到的子串的字符串。以下是一个简单的示例:

1
2
3
4
5
6
const jsonString = '{"name": "John Doe", "age": 35}';
const stringValue = JSON.stringify(jsonString);

// 将双引号替换为单引号
const singleQuotedValue = stringValue.replace(/"/g, "'");
console.log(singleQuotedValue); // '{'name': 'John Doe', 'age': 35}'

上面的示例中,使用 JSON.stringify() 将一个 JSON 对象转化为字符串,然后使用正则表达式将所有双引号替换为单引号。

除了直接指定替换字符串之外,replace()

结论

正则表达式是一个强大的工具,尤其是在文本处理和编写复杂搜索算法时特别有用。本文只介绍了 JS 正则表达式语法规则、常用方法、修饰符和集合,并提供了一些示例代码。如果想要更深入学习,可以参考 MDN 文档 或其他相关教程。 —>