目录
正则表达式(Regular Expression)
简称RE/正则,使用单个字符串来描述、匹配一系列符合某个语法规则的字符串、再前端技术应用广泛。本篇Blog以JS代码进行演示
定义语法
第一种创建正则对象的方法(建议使用)
function valid() {
/*
^在正则中表示起始符号
$在正则中表示结束符号
reg表示正则对象
*/
var reg = /^[a]$/ ;
alert(typeof reg)
}
/*输出结果为 Object */
第二种创建正则对象的方法
function valid() {
/*
^在正则中表示起始符号
$在正则中表示结束符号
reg表示正则对象
*/
var reg = new RegExp('^[a]$') ;
alert(typeof reg)
}
/*输出结果为 Object */
正则表达式的使用
之后所有操作代码都是基于
var reg = new RegExp('^[a]$'); /*之后所有操作都是基于本句改动*/
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>REGREX</title>
<script type="text/javascript">
function valid() {
/*
^在正则中表示起始符号
$在正则中表示结束符号
reg表示正则对象
*/
var reg = new RegExp('^[a]$');
/*
* getElementById() 方法可返回对拥有指定 ID 的第一个对象的引用
* 后面加.value取得引用的值
* */
var uname = document.getElementById('username').value;
/*
* 如果字符串 string 中含有与 RegExpObject 匹配的文本,则返回 true,否 则返回 false。
* */
if(reg.test(uname)){
alert("合法") ;
}else{
alert("不合法") ;
}
}
</script>
</head>
<body>
用户名:<input type="text" name="username" id="username">
<input value="点击" type="button" onclick="valid()">
</body>
</html>
正则表达式的匹配
字符类匹配
[abc] a、b 或 c 中 一位
[^abc] 非a、b 或 c 中 一位
[a-zA-Z] a 到 z 或 A 到 Z,两头的字母包括在内
var reg = new RegExp('^[a-zA-Z]$');
var reg = new RegExp('^[a-zA-Z0-9]$');
var reg = new RegExp('^[a-zA-Z0-9_]$');
ab与[ab]的区别
正则ab:能通过校验的只有ab
[ab]:能通过校验的有a或b
在单个字符的情况下,ab与[ab]一样
元字符匹配
此处默认都是一位字符,相当于我们为我们上面做的操作的一个封装
- \s :space键或tab键
转义问题
var reg = /^\w$/ ;
/*以下创建法需要使用加一杠来进行转义,这是我之前建议用第一种创建法的原因*/
数量词匹配
- ? 一次或一次也没有
- * 零次或多次
- + 一次或多次
- {n} 恰好 n 次
- {n,} 至少 n 次
- {n,m} 至少 n 次,但是不超过 m 次
var reg = /^a?$/ ;
var reg = /^a*$/ ;
var reg = /^a+$/ ;
var reg = /^a{2}$/ ;
var reg = /^a{2,}$/ ;
var reg = /^a{2,4}$/ ;
字符转义
使用场景
需匹配元字符本身,跟正则语法产生冲突如’*‘、‘\’
如何使用
在需匹配字符前加上斜杠表示转义
var reg = /^//$/ ; //表示匹配‘\’符
注意
在[]中使用元字符,不需要转义(除了’[]'本身)
var reg = /^[.]$/ ;
应用-电话号码匹配
学了这么多,我们也是时候来应用一下了。
需求:匹配(010)88886666,或022-22334455,或02912345678三种格式的电话号码
var reg = /^(\(\d{3}\)\d{8})|(\d{3}-\d{8})|(0\d{10})$/ ;
/*使用或字符|需要加括号*/
分组
我已经提过如何重复单个字符(如d{n}),这时候如果我们想重复字符串,就需要用到分组:
用小括号来指定子表达式(也叫做分组),然后你就可以指定这个子表达式的重复次数了,你也可以对子表达式进行其它一些操作
(){}
常用正则表达式
在大部分开发场景中,并不需要我们去手写正则,因为已经有前辈帮我们写好了,我们只需要去搜索对应场景的正则表达式就好了
检验数字的表达式
1 数字:^[0-9]$
2 n位的数字:^\d{n}$
3 至少n位的数字:^\d{n,}$
4 m-n位的数字:^\d{m,n}$
5 零或非零开头的数字:^(0|1-9)$
6 非零开头的最多带两位小数的数字:^(1-9*)+(.[0-9]{1,2})?$
7 带1-2位小数的正数或负数:^(-)?\d+(.\d{1,2})?$
8 正数、负数、和小数:^(-|+)?\d+(.\d+)?$
9 有两位小数的正实数:^[0-9]+(.[0-9]{2})?$
10 有1~3位小数的正实数:^[0-9]+(.[0-9]{1,3})?$
11 非零的正整数:^[1-9]\d$ 或 ^(1-9){1,3}$ 或 ^+?1-9*$
12 非零的负整数:^\-[1-9][0-9] $ 或 ^-[1-9]\d$
13 非负整数:^\d+$ 或 ^[1-9]\d|0$
14 非正整数:^-[1-9]\d|0$ 或 ^((-\d+)|(0+))$
15 非负浮点数:^\d+(.\d+)?$ 或 ^[1-9]\d.\d|0.\d[1-9]\d|0?.0+|0$
16 非正浮点数:
^((-\d+(.\d+)?)|(0+(.0+)?))$ 或 ^(-([1-9]\d.\d|0.\d[1-9]\d))|0?.0+|0$
17 正浮点数:^[1-9]\d.\d|0.\d[1-9]\d$
18 负浮点数:^-([1-9]\d.\d|0.\d[1-9]\d)$
19 浮点数:^(-?\d+)(.\d+)?$ 或 ^-?([1-9]\d.\d|0.\d[1-9]\d|0?.0+|0)$
校验字符的表达式
1 汉字:^[\u4e00-\u9fa5]{0,}$
2 英文和数字:^[A-Za-z0-9]+$ 或 ^[A-Za-z0-9]{4,40}$
3 长度为3-20的所有字符:^.{3,20}$
4 由26个英文字母组成的字符串:^[A-Za-z]+$
5 由26个大写英文字母组成的字符串:^[A-Z]+$
6 由26个小写英文字母组成的字符串:^[a-z]+$
7 由数字和26个英文字母组成的字符串:^[A-Za-z0-9]+$
8 由数字、26个英文字母或者下划线组成的字符串:^\w+$ 或 ^\w{3,20}$
9 中文、英文、数字包括下划线:^[\u4E00-\u9FA5A-Za-z0-9_]+$
10 中文、英文、数字但不包括下划线等符号:^[\u4E00-\u9FA5A-Za-z0-9]+$
11 可以输入含有^%&’,;=?
"
等
字
符
:
‘
"等字符:`%&',;=?
"等字符:‘\x22+12 禁止输入含有~“”的字符:
~\x22+`
特殊需求表达式
1 Email地址:^\w+([-+.]\w+)@\w+([-.]\w+).\w+([-.]\w+)$
2 InternetURL:^http://([\w-]+.)+[\w-]+(/[\w-./?%&=])?$
3 手机号码:
^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$
4 国内电话号码(0511-4405222、021-87888822):\d{3}-\d{8}|\d{4}-\d{7}
5 身份证号(15位、18位数字):^\d{15}|\d{18}$
6 短身份证号码(数字、字母x结尾):
^([0-9]){7,18}(x|X)?$ 或 ^\d{8,18}|[0-9x]{8,18}|[0-9X]{8,18}?$
7 帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^a-zA-Z{4,15}$
8 密码(以字母开头,长度在6~18之间,只能包含字母、数字和下划线):
^[a-zA-Z]\w{5,17}$
9 日期格式:^\d{4}-\d{1,2}-\d{1,2}
10 一年的12个月(01~09和1~12):^(0?[1-9]|1[0-2])$
11 一个月的31天(01~09和1~31):^((0?[1-9])|((1|2)[0-9])|30|31)$