计数功能型元字符
计数功能型元字符也叫标准匹配量词,也可以称作标准量词、匹配量词。
元字符 | 中文名称 | 匹配对象 |
---|---|---|
* | 星号 | 匹配任意多次,等价于 {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
此时的匹配结果才符合我们的预期。