正则表达式的量词与方法
正则表达式是一种强大的字符串匹配工具,掌握正则表达式的量词与方法对于高效处理字符串非常重要。本文将深入探讨正则表达式的量词与常用方法,并通过实际案例加深理解。
正则表达式的基本原则
在使用正则表达式时,我们需要遵循以下两个基本原则:
-
不回头原则:正则表达式在匹配字符串时,总是从左到右依次进行。一旦匹配成功,就不会再回头重新匹配。
-
贪婪匹配原则:正则表达式在匹配时,会尽可能多地匹配字符,而不是尽可能少。这种行为称为贪婪匹配,是正则表达式的默认行为。
理解并遵循这两个原则,有助于我们更好地掌握正则表达式的工作方式。
常用的量词
量词用于指定正则表达式中某个部分的出现次数。以下是一些常用的量词:
+号(匹配一次或多次)
+
号表示匹配前面的字符或子表达式一次或多次。它等价于{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>
表示匹配以</
开头,后面跟着第一个子表达式捕获的标签名,最后以>
结尾的字符串。