正则表达式:字符串匹配表达式,通过相应的表达式规则检测字符串是否含有表达式
在JavaScript中,正则表达式既是对象,具有相应的属性 (g,i等) 和方法 (test(),search()等)
正则表达式的创建:
let reg = /abc/ --- 字面量创建法
let reg = new RegExp('abc') --- 构造函数创建法
正则表达式的方法:
test --- 检测是否匹配字符串,返回true/false
/abc/.test('Who are you') //false
/are/.test('Who are you') //true
search --- 检测是否匹配字符串,匹配返回索引,不匹配返回-1
('Who are you').search(/abc/) //-1
('Who are you').search(/are/) //4
match --- 查找匹配的目标字符串,返回数组,不匹配返回null
('Who are you').match(/abc/) //null
('Who are you').search(/are/) //[ 'are', index: 4, input: 'Who are you', groups: undefined ]
exec --- 查找匹配的目标字符串,返回数组,不匹配返回null
/abc/.exec('who are you') //null
/are/.exec('who are you') //[ 'are', index: 4, input: 'Who are you', groups: undefined ]
replace --- 查找并替换匹配的目标字符串,返回替换后的字符串,可用于增加,删除,替换功能
('Who are you').replace(/abc/) //Who are you
('Who are you').replace(/are/,'abc') //Who abc you
('Who are you').replace(/are/,'') //Who you
split --- 通过目标字符串分割原字符串,并存入数组
('Who are you').split(/are/) //[ 'Who ', ' you' ]
正则表达式的属性:
g global 全局匹配 查找所有匹配项
('Who are you.What are you doing').match(/are/g) //[ 'are', 'are' ]
i ignore 不区分大小写 匹配不区分大小
('What are you.what are you doing').match(/what/i) //[ 'What', 'what' ]
m multi line - 多行匹配 使边界字符 ^ 和 $ 匹配每一行的开头和结尾,多行
("What are you\nWhat are you doing").match(/What/gm) //[ 'What', 'What' ]
s 元字符.用于匹配除换行符/n外任意字符,s用于为元字符.添加换行符/n
("What are you\nWhat are you doing").match(/you./) //[ 'you ',index: 22,input: 'What are you\nWhat are you doing',groups: undefined ]
("What are you\nWhat are you doing").match(/you./s) //[ 'you\n',index: 9,input: 'What are you\nWhat are you doing',groups: undefined ]
正则表达式的元字符:
被赋予特殊含义的字符
\ --- 转义字符,用于将特殊字符转义为普通字符,如:/\$/ --- 表示$字符,而非元字符$
^ --- 匹配字符串起始位置,如: /^a/ --- 匹配字符串起始是否为a
$ --- 匹配字符串结束位置, 如: /a$/ --- 匹配字符串结束是否为a
* --- 匹配表达式0或多次, 如: /ab*/ ---
+ --- 匹配表达式1或多次, 如: /a+/ --- 匹配字符串中所有的a字符
?--- 匹配该元字符前一个表达式0次或1次,如:/a?b/ --- 匹配字符串中的ab或b
. --- 匹配除换行符/n外任意字符, 如:/.a/ --- 匹配字符串中任意的xa字符,x为任意字符
(x) --- (表达式),匹配括号中的表达式,并记录该表达式,\1,\2,\3…… 表示正则中被依次记录的表达式,$1,$2,$3……表示原字符串中表达式位置
(?:x) --- 非捕获,匹配但不记住
x\y --- 匹配x或y
{n} --- 匹配n次前一个表达式
{n,} --- 匹配n次或大于n次前一个表达式
{n,m} --- 匹配n次和m次之间的前一个表达式
[xyz] --- 匹配[]中任意字符,可用-指定范围,[a-z] --- a到z之间的26个字母
[^xyz] --- 匹配除[]中任意字符
[\b] --- 匹配退格
\b --- 匹配边界的字符,边界 --- 紧靠空格的字符串起始,结束位置
\B --- 匹配非边界的字符
\d --- 匹配数字
\D --- 匹配非数字
\f --- 匹配换页符
\n --- 匹配换行符
\r --- 匹配回车符
\s --- 匹配空白字符
\S --- 匹配非空白字符
正则表达式示例:
//判断字符串是否属于电话号码
//手机号为起始为1,第二位为[3-9]区间任意数字,后续为[0-9]任意数字的11位字符串
let phone = '17883651129'
let reg = /^1[3-9][0-9]{9}/ //元字符^1判断起始是否为1,元字符[3-9]判断第二位是否为3-9区间内数字,[0-9]{9}后续9位判断
reg.test(phone) //true
//判断QQ邮箱:
//邮箱命名规则:大小写字母||数字||下划线开头+(任意字符)+.+@+任意字符+.com
let eMail = '318739742@qq.com'
let reg = /^[a-zA-Z0-9_-]\w+.@\w{2}.com/
reg.test(eMail) //true
常用的正则表达式:
网址: [a-zA-z]+://[^\s]*
邮箱: \w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
密码: (?=^.{8,}$)(?=.*\d)(?=.*\W+)(?=.*[A-Z])(?=.*[a-z])(?!.*\n).*$
身份证: \d{15}(\d\d[0-9xX])?