跳到主要内容

正则表达式的量词与方法

正则表达式是一种强大的字符串匹配工具,掌握正则表达式的量词与方法对于高效处理字符串非常重要。本文将深入探讨正则表达式的量词与常用方法,并通过实际案例加深理解。

正则表达式的基本原则

在使用正则表达式时,我们需要遵循以下两个基本原则:

  1. 不回头原则:正则表达式在匹配字符串时,总是从左到右依次进行。一旦匹配成功,就不会再回头重新匹配。

  2. 贪婪匹配原则:正则表达式在匹配时,会尽可能多地匹配字符,而不是尽可能少。这种行为称为贪婪匹配,是正则表达式的默认行为。

理解并遵循这两个原则,有助于我们更好地掌握正则表达式的工作方式。

常用的量词

量词用于指定正则表达式中某个部分的出现次数。以下是一些常用的量词:

+号(匹配一次或多次)

+号表示匹配前面的字符或子表达式一次或多次。它等价于{1,}。例如:

var reg = /\w+/g;
var str = 'abcdefg';
console.log(str.match(reg)); // 输出: ['abcdefg']

在这个例子中,\w+匹配一个或多个字母、数字或下划线字符。由于整个字符串都满足条件,因此匹配结果为整个字符串。

*号(匹配零次或多次)

*号表示匹配前面的字符或子表达式零次或多次。它等价于{0,}。例如:

var reg = /\w*/g;
var str = 'abcdefg';
console.log(str.match(reg)); // 输出: ['abcdefg', '']

在这个例子中,\w*匹配零个或多个字母、数字或下划线字符。由于整个字符串都满足条件,因此第一次匹配结果为整个字符串。但由于*号允许匹配零次,因此在字符串末尾还会匹配一个空字符串。

再看一个例子:

var reg = /\d*/g;
var str = 'abcdefg';
console.log(str.match(reg)); // 输出: ['', '', '', '', '', '', '', '']

在这个例子中,\d*匹配零个或多个数字字符。由于字符串中不包含任何数字,因此每个位置都匹配一个空字符串,最终得到 8 个空字符串。

?号(匹配零次或一次)

?号表示匹配前面的字符或子表达式零次或一次。它等价于{0,1}。例如:

var reg = /\w?/g;
var str = 'abcdefg';
console.log(str.match(reg)); // 输出: ['a', 'b', 'c', 'd', 'e', 'f', 'g', '']

在这个例子中,\w?匹配零个或一个字母、数字或下划线字符。由于每个字符都满足条件,因此匹配结果为每个字符组成的数组。同时,由于?号允许匹配零次,因此在字符串末尾还会匹配一个空字符串。

号(指定匹配次数)

{}号用于指定匹配的具体次数或次数范围。例如:

var reg = /\w{1,2}/g;
var str = 'abcdefg';
console.log(str.match(reg)); // 输出: ['ab', 'cd', 'ef', 'g']

在这个例子中,\w{1,2}匹配 1 到 2 个字母、数字或下划线字符。由于正则表达式默认使用贪婪匹配,因此会尽可能多地匹配字符,最终得到['ab', 'cd', 'ef', 'g']的结果。

常用的正则表达式方法

test 方法

test方法用于测试字符串是否匹配正则表达式。如果匹配成功,返回true,否则返回false。例如:

var reg = /\d+/;
console.log(reg.test('123')); // 输出: true
console.log(reg.test('abc')); // 输出: false

exec 方法

exec方法用于在字符串中搜索匹配正则表达式的结果。如果找到匹配,返回一个数组,否则返回null。例如:

var reg = /\d+/g;
var str = 'abc123def456ghi';
console.log(reg.exec(str)); // 输出: ['123', index: 3, input: 'abc123def456ghi', groups: undefined]
console.log(reg.exec(str)); // 输出: ['456', index: 9, input: 'abc123def456ghi', groups: undefined]
console.log(reg.exec(str)); // 输出: null

在这个例子中,第一次调用exec方法时,找到了第一个匹配'123',并返回了匹配结果数组。第二次调用exec方法时,从上一次匹配的位置继续搜索,找到了第二个匹配'456'。第三次调用exec方法时,已经搜索到字符串末尾,没有找到匹配,因此返回null

需要注意的是,如果正则表达式带有g标志,exec方法会记住上次匹配的位置,下次调用会从该位置继续查找。如果需要重新从头开始匹配,可以将lastIndex属性设置为 0。

match 方法

match方法用于在字符串中搜索匹配正则表达式的结果。如果正则表达式没有g标志,则返回第一个匹配的结果数组,否则返回所有匹配的结果数组。例如:

var str = 'abc123def456ghi';
console.log(str.match(/\d+/)); // 输出: ['123', index: 3, input: 'abc123def456ghi', groups: undefined]
console.log(str.match(/\d+/g)); // 输出: ['123', '456']

在第一个例子中,正则表达式没有g标志,因此match方法只返回第一个匹配的结果数组。在第二个例子中,正则表达式有g标志,因此match方法返回所有匹配的结果数组。

replace 方法

replace方法用于替换字符串中匹配正则表达式的部分。它接受两个参数:第一个参数是正则表达式,第二个参数是替换的字符串或函数。例如:

var str = 'abc123def456ghi';
console.log(str.replace(/\d+/, '000')); // 输出: abc000def456ghi
console.log(str.replace(/\d+/g, '000')); // 输出: abc000def000ghi

在第一个例子中,正则表达式没有g标志,因此replace方法只替换第一个匹配的部分。在第二个例子中,正则表达式有g标志,因此replace方法替换所有匹配的部分。

实战案例

下面通过几个实际案例,进一步加深对正则表达式量词与方法的理解。

匹配手机号码

假设我们要匹配以138开头的 11 位手机号码,可以使用以下正则表达式:

var reg = /^138\d{8}$/;
console.log(reg.test('13812345678')); // 输出: true
console.log(reg.test('13912345678')); // 输出: false

在这个正则表达式中,^表示字符串开头,$表示字符串结尾,\d{8}表示匹配 8 个数字字符。

匹配邮箱地址

假设我们要匹配常见的邮箱地址格式,可以使用以下正则表达式:

var reg = /^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/;
console.log(reg.test('example@example.com')); // 输出: true
console.log(reg.test('example@example')); // 输出: false

在这个正则表达式中,[\w-]+表示匹配由字母、数字、下划线或连字符组成的字符串,(\.[\w-]+)*表示匹配零个或多个由点号和字母、数字、下划线或连字符组成的字符串,@表示匹配@字符,(\.[\w-]+)+表示匹配一个或多个由点号和字母、数字、下划线或连字符组成的字符串。

匹配 HTML 标签

假设我们要匹配 HTML 中的标签,可以使用以下正则表达式:

var reg = /<(\w+).*?>.*?<\/\1>/g;
var str = '<div>Hello</div><p>World</p>';
console.log(str.match(reg)); // 输出: ['<div>Hello</div>', '<p>World</p>']

在这个正则表达式中,<(\w+).*?>表示匹配以<开头,后面跟着一个或多个字母、数字或下划线字符,再跟着任意字符(非贪婪匹配),最后以>结尾的字符串,并将标签名捕获到第一个子表达式中。.*?表示匹配任意字符(非贪婪匹配)。<\/\1>表示匹配以</开头,后面跟着第一个子表达式捕获的标签名,最后以>结尾的字符串。