Skip to content

计数功能型元字符

计数功能型元字符也叫标准匹配量词,也可以称作标准量词、匹配量词。

元字符中文名称匹配对象
*星号匹配任意多次,等价于 {0,}
+加号至少匹配一次,等价于 {1,}
?问号匹配零次或一次,等价于 {0,1}
{min,max}区间量词至少匹配 min 次,至多匹配 max

注意

  • 所有计数型元字符均只作用于之前紧邻的元素
  • 默认情况下匹配模式为贪婪匹配,即按至多次匹配;
  • 星号*、问号?、加号+、包括点号.、多选分支符|,在字符组内部时将被正则引擎作为普通字符处理。

星号 *

语法声明

本示例使用的JavaScript正则语法声明 const regexp = /pattern/flags:

当我们试图从字符串AchooLuv中匹配子串Ach

javascript
const regexp = /acho*/i;
const result = regexp.exec("AchooLuv");
console.log(result[0]); // 匹配结果为: Achoo

*只作用于之前紧邻的字母o,此匹配表达式也完全等价于/acho{0,}/i; 从匹配结果为Achoo,而并非是Acho可以发现:默认情况下匹配表达式是贪婪匹配模式。

如何取消贪婪匹配模式呢?

通过在计数元字符后添加?,此匹配表达式也完全等价于/acho{0,}?/i

javascript
const regexp = /acho*?/i;
const result = regexp.exec("AchooLuv");
console.log(result[0]); // 匹配结果为: Ach

在字符组内部呢?

javascript
const regexp = /[*]/i;
const result = regexp.test("AchooLuv");
console.log(result); // 匹配结果为: false

此时元字符*被正则引擎视为普通字符星号,而匹配字符串AchooLuv不包含字符*,故匹配失败。关于字符组[]的作用你可以查看:字符组

加号 +

语法声明

本示例使用的JavaScript正则语法声明 const regexp = new RegExp('pattern','flags'):

当我们试图从字符串AchooLuv中匹配子串Acho

javascript
const regexp = new RegExp("acho+", "i");
const result = regexp.exec("AchooLuv");
console.log(result[0]); // 匹配结果为: Achoo

+只作用于之前紧邻的字母o,此匹配表达式也完全等价于new RegExp('acho{1,}','i')

取消贪婪匹配模式

javascript
const regexp = new RegExp("acho+?", "i");
const result = regexp.exec("AchooLuv");
console.log(result[0]); // 匹配结果为: Acho

此时的匹配结果才符合我们的预期,此匹配表达式也完全等价于new RegExp('acho{1,}?','i')

在字符组内部

javascript
const regexp = new RegExp("[+]", "i");
const result = regexp.test("AchooLuv");
console.log(result); // 匹配结果为: false

在字符组内部被正则引擎视为普通字符加号,故匹配失败。

问号 ?

语法声明

本示例使用的JavaScript正则语法声明 const regexp = /pattern/flags:

当我们试图从字符串AchooLuv中匹配子串Acho

javascript
const regexp = /acho?/i;
const result = regexp.exec("AchooLuv");
console.log(result[0]); // 匹配结果为: Acho

?只作用于之前紧邻的字母o,匹配表达式完全等价于/acho{0,1}/i

?的另一种用法就取消贪婪匹配模式

javascript
const regexp = /acho??/i; // 此时若还想匹配Acho,必须改为 /achoo??/i
const result = regexp.exec("AchooLuv");
console.log(result[0]); // 匹配结果为: Ach

此匹配表达式完全等价于 /acho{0,1}?/i

在字符组内部

javascript
const regexp = /[?]/i;
const result = regexp.test("AchooLuv");
console.log(result); // 匹配结果为: false

在字符组内部被正则引擎视为普通字符问号,故匹配失败。

区间量词 {min,max}

语法声明

本示例使用的JavaScript正则语法声明 const regexp = new RegExp('pattern','flags'):

当我们试图从字符串AchooLuv中匹配子串Achoo

javascript
const regexp = new RegExp("acho{2,4}", "i");
const result = regexp.exec("AchooOoOo");
console.log(result[0]); // 匹配结果为: AchooOo

{min,max}只作用于之前紧邻的字母o

取消贪婪匹配模式

javascript
const regexp = new RegExp("acho{2,4}?", "i");
const result = regexp.exec("AchooOoOo");
console.log(result[0]); // 匹配结果为: Achoo

此时的匹配结果才符合我们的预期。