正则表达式
掌握基础然后多练习自然就可以看懂会写复杂的正则了。
语法
// 使用正则表达式字面量,匹配模式字符串在两个`/`之间。
var reg = /pattern/flags;
// or 使用 RegExp 构造函数
var reg = new RegExp(pattern, flags);
正则表达式的模式
正则表达式模式是简单字符和特殊字符构成的。使用正则表达式可视化工具可以清楚的查看你的正则表达式是否符合需要。
特殊字符
字符 | 含义 |
---|---|
\ | 转义字符,非特殊字符之前的\ 表示下一个字符是特殊字符。特殊字符之前的\ 表示下一个字符是非特殊字符。 |
^ | 匹配输入的开始。如果多行标志设为true ,也匹配换行符后紧跟的位置。当^ 作为字符集合模式的第一个字符([^...] ),具有反向字符集合的含义。 |
$ | 匹配输入的结束。如果多行标志设为true ,也匹配换行符前的位置。 |
* | 匹配前一个表达式 0 次或多次。等价于{0,} 。 |
+ | 匹配前面一个表达式 1 次或者多次。等价于{1,} 。 |
? | 匹配前面一个表达式 0 次或者 1 次。等价于{0,1} 。如果紧跟在任何量词*, +, ?或{}的后面,将会使量词变为非贪婪(匹配尽量少的字符),默认使用贪婪模式。 |
. | 默认匹配除换行符之外的任何单个字符。如果dotAll 标志设为true ,也会匹配换行符。 |
(x) | 捕获括号。匹配x 并记住匹配项。正则表达式匹配环节在括号之后使用\n (n>=1)表示第 n 个捕获括号的匹配项,正则表达式替换环节则使用$n 。 |
(?:x) | 非捕获括号。匹配x 但不记住匹配项。用于定义一个子表达式但不参与后续的正则表达式匹配或替换环节。 |
x(?=y) | 仅当 x 后面跟着 y 时匹配 x,这叫先行断言。 |
(?<=y)x | 仅当 x 前面是 y 时匹配 x,这叫后行断言。 |
x(?!y) | 仅当 x 后面不跟着 y 时匹配 x,这叫正向否定查找。 |
(?<!y)x | 仅当 x 前面不是 y 时匹配 x,这叫反向否定查找。 |
x|y | 匹配 x 或 y。 |
{n} | 匹配前一个字符或子表达式出现 n 次(n>=0)。 |
{n,} | 匹配前一个字符或子表达式至少出现 n 次(n>=0)。 |
{n,m} | 匹配前一个字符或子表达式至少出现 n 次,至多 m 次(0 <= n <= m)。 |
[xyz] | 字符集合。匹配其中任意一个字符,可以使用- 表示范围(- 不能出现在开头或结尾,否则表示- 字符)。 |
[^xyz] | 反向字符集合。匹配非字符集合中的任意一个字符,可以使用- 表示范围(- 不能出现在^ 之后或结尾,否则表示- 字符)。 |
[\b] | 匹配一个退格(U+0008)。 |
\b | 匹配一个单词边界(比如空格),但是匹配中不包含这个边界。 |
\B | 匹配一个非单词边界,匹配中不包含这个非边界。 |
\d | 匹配一个数字。等价于[0-9] 。 |
\D | 匹配一个非数字。等价于[^0-9] 。 |
\f | 匹配一个换页符(U+000C)。 |
\n | 匹配一个换行符(U+000A)。 |
\r | 匹配一个回车符(U+000D)。 |
\s | 匹配一个空白字符,包括空格、制表符、换页符和换行符。等价于[\f\n\r\t\v\u00a0\u1680\u180e\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff] 。 |
\S | 匹配一个非空白字符。等价于[^\f\n\r\t\v\u00a0\u1680\u180e\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff] 。 |
\t | 匹配一个水平制表符(U+0009)。 |
\v | 匹配一个垂直制表符(U+000B)。 |
\w | 匹配一个单字字符(字母、数字或者下划线)。等价于[A-Za-z0-9_] 。 |
\W | 匹配一个非单字字符。等价于[^A-Za-z0-9_] 。 |
\n | 返回第 n 个子捕获匹配的子字符串(捕获的数目以左括号计数)。 |
\0 | 匹配 NULL(U+0000)字符。如果后面跟其它数字表示一个八进制的转义序列。 |
\cX | 当 X 是处于 A 到 Z 之间的字符的时候,匹配字符串中的一个控制符。 |
\xhh | 匹配一个两位十六进制数(\x00-\xFF)表示的字符。 |
\uhhhh | 匹配一个四位十六进制数表示的 UTF-16 代码单元。 |
\u{hhhh}或\u{hhhhh} | (仅当设置了 u 标志时)匹配一个十六进制数表示的 Unicode 字符。 |
标志位
标志 | 描述 |
---|---|
g | 全局搜索 |
i | 不区分大小写搜索 |
m | 多行搜索 |
s | dotAll,允许. 匹配换行符 |
u | 允许 unicode 码的模式进行匹配 |
y | 执行粘性搜索,匹配从目标字符串的当前位置开始 |
断言
断言的组成之一是边界。对于文本、词或模式,边界可以用来表明它们的起始和终止部分(如先行断言,后行断言及条件表达式)。
边界断言
边界断言包含:^
, $
, \b
, \B
。这些代表文本字符串的开始结束及单词的边界。
其它断言
其它断言包含:先行断言,后行断言,先行否定断言,后行否定断言。代表必须符合某个边界条件才会匹配。
字符类
字符类可以区分各种字符。例如区分字母和数字。
.
, \d
, \D
, \w
, \W
, \s
, \S
, \t
, \r
, \n
, \v
, \f
, [\b]
, \0
, \cX
, \xhh
, \uhhhh
, \u{hhhh}或\u{hhhhh}
等各自代表特定类型的字符。
组和范围
匹配字符集及捕获组和非捕获组以及具名捕获组。
x|y
, [xyz]
, [^a-c]
, (x)
, \n
, (?<customName>x)
, (?:x)
等都可以表示成字符集的形式,代表匹配和记住的范围。
量词
量词表示匹配的字符或表达式的数量。
*
, +
, ?
, {n}
, {n,}
, {n,m}
表示个数。这些量词匹配默认会尽可能多的匹配。这些量词之后可以加?
,这样就是非贪婪模式,一旦找到匹配就停止。
Unicode 属性转义
支持根据 Unicode 属性进行匹配。适合匹配表情,标点符号及特定语言或文字的字母。
结尾
最后附上一些常用的正则表达式案例。