计数功能型元字符
计数功能型元字符也叫标准匹配量词,也可以称作标准量词、匹配量词。
| 元字符 | 中文名称 | 匹配对象 |
|---|---|---|
* | 星号 | 匹配任意多次,等价于 {0,} |
+ | 加号 | 至少匹配一次,等价于 {1,} |
? | 问号 | 匹配零次或一次,等价于 {0,1} |
{min,max} | 区间量词 | 至少匹配 min 次,至多匹配 max 次 |
注意
- 所有计数型元字符均
只作用于之前紧邻的元素; - 默认情况下匹配模式为
贪婪匹配,即按至多次匹配; - 星号
*、问号?、加号+、包括点号.、多选分支符|,在字符组内部时将被正则引擎作为普通字符处理。
星号 *
语法声明
本示例使用的JavaScript正则语法声明 const regexp = /pattern/flags:
当我们试图从字符串AchooLuv中匹配子串Ach:
const regexp = /acho*/i;
const result = regexp.exec("AchooLuv");
console.log(result[0]); // 匹配结果为: Achoo*只作用于之前紧邻的字母o,此匹配表达式也完全等价于/acho{0,}/i; 从匹配结果为Achoo,而并非是Acho可以发现:默认情况下匹配表达式是贪婪匹配模式。
如何取消贪婪匹配模式呢?
通过在计数元字符后添加?,此匹配表达式也完全等价于/acho{0,}?/i
const regexp = /acho*?/i;
const result = regexp.exec("AchooLuv");
console.log(result[0]); // 匹配结果为: Ach在字符组内部呢?
const regexp = /[*]/i;
const result = regexp.test("AchooLuv");
console.log(result); // 匹配结果为: false此时元字符*被正则引擎视为普通字符星号,而匹配字符串AchooLuv不包含字符*,故匹配失败。关于字符组[]的作用你可以查看:字符组
加号 +
语法声明
本示例使用的JavaScript正则语法声明 const regexp = new RegExp('pattern','flags'):
当我们试图从字符串AchooLuv中匹配子串Acho:
const regexp = new RegExp("acho+", "i");
const result = regexp.exec("AchooLuv");
console.log(result[0]); // 匹配结果为: Achoo+只作用于之前紧邻的字母o,此匹配表达式也完全等价于new RegExp('acho{1,}','i')。
取消贪婪匹配模式
const regexp = new RegExp("acho+?", "i");
const result = regexp.exec("AchooLuv");
console.log(result[0]); // 匹配结果为: Acho此时的匹配结果才符合我们的预期,此匹配表达式也完全等价于new RegExp('acho{1,}?','i')。
在字符组内部
const regexp = new RegExp("[+]", "i");
const result = regexp.test("AchooLuv");
console.log(result); // 匹配结果为: false在字符组内部被正则引擎视为普通字符加号,故匹配失败。
问号 ?
语法声明
本示例使用的JavaScript正则语法声明 const regexp = /pattern/flags:
当我们试图从字符串AchooLuv中匹配子串Acho:
const regexp = /acho?/i;
const result = regexp.exec("AchooLuv");
console.log(result[0]); // 匹配结果为: Acho?只作用于之前紧邻的字母o,匹配表达式完全等价于/acho{0,1}/i。
?的另一种用法就取消贪婪匹配模式
const regexp = /acho??/i; // 此时若还想匹配Acho,必须改为 /achoo??/i
const result = regexp.exec("AchooLuv");
console.log(result[0]); // 匹配结果为: Ach此匹配表达式完全等价于 /acho{0,1}?/i
在字符组内部
const regexp = /[?]/i;
const result = regexp.test("AchooLuv");
console.log(result); // 匹配结果为: false在字符组内部被正则引擎视为普通字符问号,故匹配失败。
区间量词 {min,max}
语法声明
本示例使用的JavaScript正则语法声明 const regexp = new RegExp('pattern','flags'):
当我们试图从字符串AchooLuv中匹配子串Achoo:
const regexp = new RegExp("acho{2,4}", "i");
const result = regexp.exec("AchooOoOo");
console.log(result[0]); // 匹配结果为: AchooOo{min,max}只作用于之前紧邻的字母o。
取消贪婪匹配模式
const regexp = new RegExp("acho{2,4}?", "i");
const result = regexp.exec("AchooOoOo");
console.log(result[0]); // 匹配结果为: Achoo此时的匹配结果才符合我们的预期。
