正则表达式

正则表达式 (Regular Expression) 语言由两种基本字符类型组成:原义(正常)文本字符和元字符。元字符使正则表达式具有处理能力。所谓元字符就是指那些在正则表达式中具有特殊意义的专用字符。

语法

字面量, 构造函数和工厂符号都可以定义一个正则对象

1
2
3
4
5
/pattern/flags
new RegExp(pattern, [flags])
RegExp(pattern, [flags])
//例如
var re = new RegExp(/^\d{3,}$/, ["i"])

pattern:正则表达式的文本
flags:修饰符

flags描述
i执行对大小写不敏感的匹配
g全局匹配(会查找所有匹配结果,不会在查找到第一个匹配后就停止)
m执行多行匹配

元字符

定位符描述
^匹配行或者字符串的起始位置,有时还会匹配整个文档的起始位置
$匹配行或字符串的结尾
\b匹配单词边界,即单词与空格间的位置
\B匹配非单词边界

字符描述
\d匹配数字
\D匹配任意非数字的字符
\w匹配字母,数字,下划线
\W匹配任意不是字母,数字,下划线的字符
.匹配除了换行符以外的任何字符
( )标记一个子表达式的开始和结束位置,常用于分组,子表达式可以获取供以后使用
|类似于或运算符,匹配两项之间的一个选择
[中括号表达式的开始
{限定符表达式的开始
\将下一个字符进行转义,要匹配’\d’,请使用’\\d’
[abc]匹配括号内指定元素的字符,也可以写成 [a-z] 匹配所有小写英文字母
[^abc]匹配除了abc以外的任意字符

非打印字符描述
\cx匹配由x指明的控制字符,例如 \cM 匹配一个 Control-M 或回车符,x 的值必须为A-Z或a-z之一
\f匹配一个换页符,等价于 \x0c 和 \cL
\n匹配一个换行符,等价于 \x0a 和 \cJ
\r匹配一个回车符,等价于 \x0d 和 \cM
\s匹配任何空白字符,包括空格、制表符、换页符等等,等价于 [\f\n\r\t\v]
\S匹配任何非空白字符,等价于 [^\f\n\r\t\v]
\t匹配一个制表符,等价于 \x09 和 \cI
\v匹配一个垂直制表符,等价于 \x0b 和 \cK

贪婪限定符描述
*匹配前面的子表达式任意次
+匹配前面的子表达式一次或多次
?匹配前面的子表达式零次或一次
{n}匹配n次( n>0 )
{n,}至少匹配n次( n>0 )
{n,m}至少匹配n次且最多匹配m次( m>=n>0 )

惰性限定符描述
*?匹配前面的子表达式任意次,但是尽可能少重复
+?匹配前面的子表达式一次或多次,但是尽可能少重复
??匹配前面的子表达式零次或一次,但是尽可能少重复
{n,}?至少匹配n次( n>0 ),但是尽可能少重复
{n,m}?至少匹配n次且最多匹配m次( m>=n>0 ),但是尽可能少重复

正则进阶

捕获型描述
( abc )匹配abc,并捕获文本到自动命名的组里
( ?<name>abc )匹配abc,并捕获文本到名称为name的组里
非捕获型描述
( ?:x )匹配abc,不捕获匹配的文本,也不给此分组分配组号
( ?=x )零宽度正先行断言,仅当子表达式 x 在此位置的右侧匹配时才继续匹配,且此构造不会回溯。例如,/\d+(?=\.)/ 匹配 “3.141” 中数字后面是".“的实例,也就是"3”。
( ?!x )零宽度负先行断言,仅当子表达式 x 不在此位置的右侧匹配时才继续匹配,例如,/\d+(?!\.)/ 匹配 “3.141x159” 中数字后面不是".“的实例,也就是"141”。
( ?<=x )零宽度正后发断言(ES9已支持),仅当子表达式 x 在此位置的左侧匹配时才继续匹配,且此构造不会回溯,例如,/(?<=\.)\d+/ 匹配 “3.141” 中跟在".“后面的数字实例,也就是"141”。
( ?<!x )零宽度负后发断言(ES9已支持),仅当子表达式 x 不在此位置的左侧匹配时才继续匹配,例如,/(?!\.)\d{3}/ 匹配 “3.141x592” 中没有跟在".“后面的三位数字实例,也就是"592”。

应用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//匹配手机号
/^1[34578]{9}$/
//验证邮箱
/^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+$/
//验证身份证
/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/
//验证用户名
/^[a-zA-Z][a-zA-Z0-9\-\_]{5,15}$/
//验证中文混合用户名
/^[\u4e00-\u9fa5a\-\w]+$/
//8-16位密码,数字字母两者都有
/^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{8,16}$/
//获取url的search参数
/^\?s=(.*)$/

在线测试工具


更多

  1. 正则对象在线文档
  2. ES9支持正则表达式反向断言