# 正则表达式
# 正则表达式快速入门
# 创建方式
创建正则方式通常有两种:
var reg = /abc/
var reg = new RegExp("abc","i")
//规则 ,修饰符
# 修饰符
reg = /abc/i
,忽略大小小/abc/m
多行匹配/abc/g
全局匹配
# 表达式
- 方括号: [] 代表取符合范围的一个数
例如: [0-9] 0 到 9 [abc] a 到 c [0-9A-z]
var reg = /[1-3]/g;
var str = "123dasdasdasd123123123asdasdasdas";
- 表达式里面^代表非
var reg = /[^a][^b]/g var str = "abcdef"
str.match(reg) = ["bc","cd","de","ef"]
- 或
var reg = /(abc|bcd)/g
,abc 或 bcd
# 元字符
- \w :
var reg = /\w/g
单词字符\w=[0-9A-z] \W = [^\w]
- \d :
var reg = \d
数字\d = [0-9] \D = [^\w]
- \s: 查找空白字符
\s = [\t\n\r\v\f ] \S = [^\s]
- \b : 单词边界
- \B: 非单词边界
- \t: tab 空格,但是不能匹配视觉的 table
var = /\tabc/
才能匹配 - \u: unicode 编码 \u0000 十六进制,\uffff:u 后面两位代表层级,一共有 16 层,可以匹配汉字
- . : .代表除了换行和结束符
var reg = /./g .===[^\r\n]
表达式区间代表一切区间的写法:
利用补集合集合 :例如 var reg = /[\s\S]/g
# 量词
-- n+ : {1,正无穷} var reg = /\w+/g
+代表可以 1 次和多次,单词
- n*: {0,正无穷}
var reg = /\w*/g;
var str = "abc";
str.match(reg) = ["abc", ""]; //记得考虑会有匹配就是空的情况
- n? {0,1} var reg = /\w?/g
- n{X}: {count} 匹配 count 次 var reg = /\w{3}/
- n{x,y}: {x,y} 次
- n$ 结尾
- n^ 开头
# 函数
test() :
reg.test(str)
,正则表达式测试你这个字符串到底有没有我这个规则的字符串exec():
reg.exec(str)
,搜索符合该规则的字符串并返回完整的信息(类数组),每次返回的是 reg.lastIndex 也就是说符合规则的字符有很多,它按游标的形式向右匹配,index 返回的lastIndex
,如果没有/g 修饰符,index 永远等于 0
var reg = /ab/g;
var str = "abababab";
console.log(reg.exec(str)); // index = 0
console.log(reg.exec(str)); // index = 2
- 字符串的 match 方法:找出符合正则的字符串片段数组
- 字符串的 replace 方法:
str.replace(reg,str)
,替换匹配的字符串
var str = "abcdeabababa";
console.log(str.match(/ab/g)); //[ab,ab,ab,ab]
# 例题
- 检验字符串首尾是否含有数字:首或尾有数字
var reg = /^\d|\d$/g;
- 首尾都有数字
拉伸区间次数(中间插入[\s\S]* 代表任意字符)
var reg = /^\d[\s\S]*\d$/g;
- 匹配类似 xxxx 的字符串 例如"aaaabbbbc" 返回 ["aaaa","bbbb"]
(\w)\1 \1 代表反向引用,直接拷贝一份引用,意思就是前两个都是单词并且相等,所以上述规则成立
var reg = /(\w)\1\1\1/g; //
- 匹配 aabb 式
var reg = /(\w)\1(\w)\2/g;
# 常用的正则表达式收集
更完整的正则表达式地址 (opens new window)
验证数字的正则表达式集
验证数字:^[0-9]*$
验证n位的数字:^\d{n}$
验证至少n位数字:^\d{n,}$
验证m-n位的数字:^\d{m,n}$
验证零和非零开头的数字:^(0|[1-9][0-9]*)$
验证有两位小数的正实数:^[0-9]+(.[0-9]{2})?$
验证有1-3位小数的正实数:^[0-9]+(.[0-9]{1,3})?$
验证非零的正整数:^\+?[1-9][0-9]*$
验证非零的负整数:^\-[1-9][0-9]*$
验证非负整数(正整数 + 0) ^\d+$
验证非正整数(负整数 + 0) ^((-\d+)|(0+))$
验证长度为3的字符:^.{3}$
验证由26个英文字母组成的字符串:^[A-Za-z]+$
验证由26个大写英文字母组成的字符串:^[A-Z]+$
验证由26个小写英文字母组成的字符串:^[a-z]+$
验证由数字和26个英文字母组成的字符串:^[A-Za-z0-9]+$
验证由数字、26个英文字母或者下划线组成的字符串:^\w+$
验证用户密码:^[a-zA-Z]\w{5,17}$ 正确格式为:以字母开头,长度在6-18之间,只能包含字符、数字和下划线。
验证是否含有 ^%&',;=?$\" 等字符:[^%&',;=?$\x22]+
验证汉字:^[\u4e00-\u9fa5],{0,}$
验证Email地址:^\w+[-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
验证InternetURL:^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$ ;^[a-zA-z]+://(w+(-w+)*)(.(w+(-w+)*))*(?S*)?$
验证电话号码:^(\d3,4\d3,4|\d{3,4}-)?\d{7,8}$:--正确格式为:XXXX-XXXXXXX,XXXX-XXXXXXXX,XXX-XXXXXXX,XXX-XXXXXXXX,XXXXXXX,XXXXXXXX。
验证身份证号(15位或18位数字):^\d{15}|\d{}18$
验证一年的12个月:^(0?[1-9]|1[0-2])$ 正确格式为:“01”-“09”和“1”“12”
验证一个月的31天:^((0?[1-9])|((1|2)[0-9])|30|31)$ 正确格式为:01、09和1、31。
整数:^-?\d+$
非负浮点数(正浮点数 + 0):^\d+(\.\d+)?$
正浮点数 ^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$
非正浮点数(负浮点数 + 0) ^((-\d+(\.\d+)?)|(0+(\.0+)?))$
负浮点数 ^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$
浮点数 ^(-?\d+)(\.\d+)?$
# 附录
匹配手机
function checkPhone() {
if (!/^1[345678]\d{9}$/.test(phone)) {
alert("手机号码有误,请重填");
return false;
}
}
去除字符串中的数字
var string = 'func56t9i10on'
var number = string.replace(/[^0-9]/ig, '')
number 结果 "56910"
var reg = /[1-9][0-9]*/g
var string = 'func56t9i10on'
var number = string.match(reg)
number 结果 ["56", "9", "10"]
var string2 = 'func5678tion'
string2.match(reg) 结果 ["5678"]