正则表达式是一种通用的工具,在 JavaScript、PHP、Java、Python、C++ 等几乎所有的编程语言中都能使用;但是,不同编程语言对正则表达式语法的支持不尽相同,有的编程语言支持所有的语法,有的仅支持一个子集。本节讲到的正则表达式语法适用于 JavaScript。
正则表达式的语法体现在字符模式上。字符模式是一组特殊格式的字符串,它由一系列特殊字符和普通字符构成,其中每个特殊字符都包含一定的语义和功能。
描述字符
根据正则表达式语法规则,大部分字符仅能够描述自身,这些字符被称为普通字符,如所有的字母、数字等。
原子表
在正则表达式语法中,方括号表示字符范围。在方括号中可以包含多个字符,表示匹配其中任意一个字符。如果多个字符的编码顺序是连续的,可以仅指定开头和结尾字符,省略中间字符,仅使用连字符~表示。如果在方括号内添加脱字符^前缀,还可以表示范围之外的字符。例如:
- [abc]:查找方括号内任意一个字符。
- [^abc]:查找不在方括号内的字符。
- [0-9]:查找从 0 至 9 范围内的数字,即查找数字。
- [a-z]:查找从小写 a 到小写 z 范围内的字符,即查找小写字母。
- [A-Z]:查找从大写 A 到大写 Z 范围内的字符,即查找大写字母。
- [A-z]:查找从大写 A 到小写 z 范围内的字符,即所有大小写的字母。
量词
量词符用来设定某个模式出现的次数。
-
* 重复0次或多次
-
+ 重复1次或多次
-
? 重复0次或1次
-
{n} 重复n次
-
{n,} 重复n次或多次
-
{n,m} 重复n到m次
贪婪和吝啬
- *? 重复任意次,但尽可能少重复
- +? 重复1次或更多次,但尽可能少重复
- ?? 重复0次或1次,但尽可能少重复
字符边界^$
- ^ 匹配开头,在多行检测中,会匹配一行的开头
- $ 匹配结尾,在多行检测中,会匹配一行的结尾
单词边界限制
- \b 匹配单词的边界
- \B 匹配除单词边界以外的部分
选择表达式
分组与引用 分组的语法是圆括号包裹(xxx) 分组不能放在[]中
修饰符
默认正则是区分大小写,这可能并不是我们想要的,正则提供了修饰符的功能,语法如下
/xxx/gi // 最后面的g和i就是两个修饰符
-
g正则遇到第一个匹配的字符就会结束,加上全局修复符,可以让其匹配到结束
-
i正则默认是区分大小写的,i可以忽略大小写
-
m正则默认遇到换行符就结束了,不能匹配多行文本,m可以让其匹配多行文本
-
u用来正确处理大于\uFFFF的 Unicode 字符。也就是说,会正确处理四个字节的 UTF-16 编码。
-
y “粘连”修饰符,确保匹配必须从剩余的第一个位置开始,这也就是“粘连”的涵义。
-
s修饰符,使得.可以匹配任意单个字符 dotAll模式
/s修饰符和多行修饰符/m不冲突,两者一起使用的情况下,.匹配所有字符,而^和$匹配每一行的行首和行尾。
元字符/原子
元字符就是拥有特动功能的特殊字符,大部分需要加反斜杠进行标识,以便于普通字符进行区别,而少数元字符,需要加反斜杠,以便转译为普通字符使用。JavaScript 正则表达式支持的元字符如表所示。
. 查找单个字符,除了换行和行结束符
\w 查找单词字符
\W 查找非单词字符
\d 查找数字
\D 查找非数字字符
\s 查找空白字符
\S 查找非空白字符
\b 匹配单词边界
\B 匹配非单词边界
\0 查找 NUL字符
\n 查找换行符
\f 查找换页符
\r 查找回车符
\t 查找制表符
\v 查找垂直制表符
\xxx 查找以八进制数 xxxx 规定的字符
\xdd 查找以十六进制数 dd 规定的字符
\uxxxx 查找以十六进制 xxxx规定的 Unicode 字符
模式匹配的顺序
顺序 | 元字符 | 说明 |
---|---|---|
1 | () | 模式单元 |
2 | ?*{} | 重复匹配 |
3 | ^$ | 边界限制 |
4 | | | 模式选择 |
网友评论