# 正则基础及常用正则

首先,正则是一种搜索模式

  • 正则表达式是由一个字符序列形成的搜索模式。
  • 当你在文本中搜索数据时,你可以用搜索模式来描述你要查询的内容。
  • 正则表达式可以是一个简单的字符,或一个更复杂的模式。
  • 正则表达式可用于所有文本搜索和文本替换的操作。

正则的语法如下:

/正则表达式主体/ 修饰符(可选)

正则在不同语言中可能略有差异,解析器也在不同环境中不完全相同,经典的表达式结构是 perl正则,基本语法在各语言中相同,特殊的操作可能略有差异。

以js中的正则为例

var rule = /abc/i

以上示例中是匹配字母“abc”,i 修饰符的含义是不区分大小写。

# 修饰符

修饰符 说明
i 执行对大小写不敏感的匹配
g 执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)
m 执行多行匹配
var rule = /[abc]/i

以上示例中是包含字母“abc”, [] 是一种正则“模式”

# 表达式模式

表达式 说明
[abc] 查找方括号之间的任何字符
[^abc] 查找除方括号字符之外的任何字符
[0-9] 查找任何从 0 至 9 的数字
[A-Z] 表示一个区间,查找所有大写字母
[a-z] 查找所有小写字母
(x | y) 查找任何以 | 分隔的选项
\w 查找字母、数字、下划线。等价于 [A-Za-z0-9_]或[a-zA-Z0-9_]

# 元字符

元字符是拥有特殊含义的替代字符

表达式 说明
\d 查找数字
\s 查找空白字符,空格或tab
\b 匹配单词边界
\uxxxx xxxx表示四个十六进制数字表示的 Unicode 字符。例如, \u00A9 匹配版权符号©。

# 量词

表达式 说明
n+ 匹配任何包含至少一个n的字符串,等价于{1,}
n* 匹配任何包含0个或多个n的字符串,等价于{0,}
n? 匹配任何包含0个或1个n的字符串,等价于{0,1}
{n} 匹配n次,例如,'o{2}' 不能匹配 "Bob" 中的 'o',但能匹配 "food"中的所有 o
{n,} 至少匹配n次
{n,m} 最少匹配n次,最多匹配m次

# 位置

表达式 说明
^ 以此开头
$ 以此结尾

# 使用RegExp对象

js中我们使用正则的方式是利用RegExp对象

常规声明方式如下

// 可以搜索不区分大小写的字母a
var ruleA = new RegExp(/a/i);

推荐的快速声明方式如下

var ruleA = /a/i;

将字符串转为正则

// 完整正则
var rule = '/a/i'
var ruleRegExp = eval(rule);
// 正则条件
var str = '^[\w\u4e00-\u9fa5]{6,8}$';
var strRegExp = new RegExp(str);

两种方式功能相同,但 eval 非常耗时,不推荐使用。

# 常用正则

// 手机号码 第一位是1,第二位是3、4、5、6、7、8、9的11位数
var tel = /^1[3|4|5|6|7|8|9]\d{9}$/;

// 用户密码 英文大小写及数字 6-30位
var password = /^[a-zA-Z0-9]{6,30}$/;

// 邮箱 
var email = /[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}/;

// 用户名 纯中文
var userName = /^[\w\u4e00-\u9fa5]{6,8}$/;

# 练习

[^a-z] //除了小写字母以外的所有字符 

[^\\\/\^] //除了(\)(/)(^)之外的所有字符 

[0-9\.\-] //匹配所有的数字,句号和减号 

/^Chapter|Section [1-9][0-9]{0,1}$/ //如果输入字符串是 Chapter22 只能匹配Chapter
/^(Chapter|Section) [1-9][0-9]{0,1}$/ //可以匹配到 Chapter22 和 Section22

/\d{2}-[a-z]{5}/ //验证由两位数字、一个连字符再加 5 位小写字母组成的 ID 号。