在工作中我们经常遇到可以用正则来大大提高效率的场景,但是面对一串复杂的正则表达式,如果我们看不懂,就算去网上找到也无法知道这个正则写的有没有问题,所以,不如直接学会它,掌握它!我整理了正则的所有符号用法,可以发现正则其实并不复杂,学完这篇文章,再加上几个例子,自己多试验一下,相信以后用起正则来就很顺手了。
限定符
限定符用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。
限定符 | 描述 |
---|---|
* | 匹配前面的子表达式0次或多次 |
+ | 匹配前面的子表达式1次或多次 |
? | 匹配前面的子表达式0次或1次 (或指明一个非贪婪限定符,起限制作用) |
{n} | 匹配前面的子表达式n次 |
{n,} | 至少匹配n次 |
{n,m} | 最少匹配n次且最多匹配m次 |
通过在 *、+ 或 ? 限定符之后放置 ?,该表达式从"贪婪"表达式转换为"非贪婪"表达式或者最小匹配。
定位符
定位符 | 描述 |
---|---|
^ | 匹配字符串的开始位置。(在方括号表达式中使用,表示不接受该方括号表达式中的匹配,相当于取反) |
$ | 匹配输入字符串的结尾。 |
. | 匹配除了换行符\n之外的任何字符 (在方括号表达式中使用,[.] 只会匹配 .字符,等价于.) |
\b | 匹配一个单词的前或后边界 |
\B | 匹配非单词边界 |
\n | 换行符。等价于 \x0a 和 \cJ。 |
\r | 回车符。等价于 \x0d 和 \cM。 |
\f | 换页符。等价于 \x0c 和 \cL。 |
\t | 制表符。等价于 \x09 和 \cI。 |
\v | 垂直制表符。等价于 \x0b 和 \cK。 |
\w | 匹配字母、数字、下划线。等价于'[A-Za-z0-9_]'。 |
\W | 匹配非字母、数字、下划线。等价于 '[^A-Za-z0-9_]'。 |
\d | 匹配一个数字字符。等价于 [0-9]。 |
\D | 匹配一个非数字字符。等价于 [^0-9]。 |
\s | 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。注意 Unicode 正则表达式会匹配全角空格符。 |
\S | 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。 |
\cx | 匹配由x指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 'c' 字符。 |
注意:不能将限定符与定位符一起使用
特殊字符
特别字符 | 描述 |
---|---|
() | 标记一个子表达式的开始和结束位置 |
[ | 标记一个方括号表达式的开始 |
{ | 标记限定符表达式的开始 |
\ | 将下一个字符标记为特殊字符、原义字符、向后引用、八进制转义符 |
i | 放在表达式结尾,标记匹配不区分大小写 |
g | 放在表达式结尾,标记查到尽可能多的匹配 |
选择
用圆括号将所有选择项括起来,相邻的选择项之间用|分隔。
字符 | 描述 |
---|---|
| | 指明两项之间的一个选择 |
注意:用圆括号会有一个副作用,使相关的匹配会被缓存,此时可用?:放在第一个选项前来消除这种副作用。
反向引用
对一个正则表达式模式或部分模式两边添加圆括号将导致相关匹配存储到一个临时缓冲区中,所捕获的每个子匹配都按照在正则表达式模式中从左到右出现的顺序存储。
缓冲区编号从 1 开始,最多可存储 99 个捕获的子表达式。
每个缓冲区都可以使用 \n 访问,其中 n 为一个标识特定缓冲区的一位或两位十进制数。
可以使用非捕获元字符 ?:、?= 或 ?! 来重写捕获,忽略对相关匹配的保存。
反向引用的最简单的、最有用的应用之一,是提供查找文本中两个相同的相邻单词的匹配项的能力。
字符 | 描述 |
---|---|
(pattern) | 匹配pattern并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到(在JScript 中则使用 9 属性) |
(?:pattern) | 匹配pattern但不获取匹配结果,不进行存储供以后使用。这在使用 "或" 字符来组合一个模式的各个部分时很有用。 |
key(?=pattern) | 正向肯定预查,匹配后面符合pattern条件的key |
key(?!pattern) | 正向否定预查,匹配后面不符合pattern条件的key |
(?<=pattern)key | 反向肯定预查, 匹配前面符合pattern条件的key |
(?<!pattern)key | 反向否定预查,匹前后面不符合pattern条件的key |
示例
- 匹配正整数:/[1-9][0-9]*$/
- 匹配1~99的正整数: /[1-9][0-9]?/ 或者 /[1-9][0-9]{0,1}/
- 匹配<>之间的所有内容: /<.*>/ (在同一行中会匹配多次取合集)
- 匹配<>之间的所有内容: /<.*?>/ (在同一行中只会匹配最多一次)
- 匹配Chapter单词中的Cha:/\bCha/
- 匹配Chapter单词中的ter:/ter\b/
- 匹配Chapter单词中的apt: /\Bapt/
var str = `
CNY: 128.04
USD: 22.5
USD: 23.5
CNY: 23
HKD: 1533.5
CNY: 23.78`
var patt1 = /CNY: \d+(\.\d+)*/g // 打印出CNY的所有条目
var patt2 = /(?<=CNY: )\d+(\.\d+)*/g // 打印出前缀是CNY: 的数字
var patt3 = /CNY: (?=[2,3]{2})/g // 打印出符合 22、23、32、33的CNY
document.write(str3.match(patt));