正则表达式(常用正则总结)
正则表达式的特点
1.灵活性、逻辑性和功能性非常强
2.可以迅速的用极简的方式达到字符串的复杂控制
正则在JS中的使用
1.利用RegExp对象来创建正则表达式
var regexp = new RegExp(/123/)
console.log(regexp);//123
2.利用字面量创建
var rg = /123/; //123
test 测试正则表达式
regexobj.tex(str)
(1) regexobj是写的正则表达式
(2)str是要检测的文本
(3)作用:test()正则对象方法,检测str文本是否符合写的正则表达式的规范,符合就返回true,否则false
var rg = /123/;
console.log(rg.test(123));
边界符:用来提示字符所处的位置,主要有两个字符
^ 表示匹配行首的文本(以谁开始)
$ 表示匹配行尾的文本(以谁结束)
var rg = /abc/;
正则里面不需要加引号 不管是数字型还是字符串型
/abc/只要包含有abc这个字符返回的都是true
console.log(rg.test('abc'));//true
console.log(reg.test('aabc'));//true
var rg = /^abc/;
以abc开头的
console.log(rg.test('abc'));//true
console.log(reg.test('aabc'));//false
var rg = /^abc$/;
精确匹配 必须是 abc 字符串才符合
console.log(rg.test('abc'));//true
console.log(reg.test('abcd'));//false
console.log(reg.test('aabc'));//false
字符类:[ ] 表示有一系列的字符可供选择,只要匹配其中一个就可以了
var rg = /[abc]/; //只要包含有a或者b或者c都返回true
console.log(reg.test('addddd'));//true
console.log(reg.test('errrrrrr'));//false
var rg1 = /^[abc]$/; //只有是a 或者b或者c 才返回true
console.log(reg.test('a'));//true
console.log(reg.test('aaaa'));//false
[-] 方括号内部范围符-
var rg2 = /^[a-z]$/; //26个英文字母任何一个字母返回true
console.log(reg.test('a'));//true
console.log(reg.test('g'));//true
console.log(reg.test(1));//false
字符组合
var rg2 = /^[a-zA-Z-9_-]$/;//26个大小写英文字母或者数字或者下划线或者短横线返回true
var rg3 = /^ a-zA-Z-9_-$/; 中括号里面 ^ 表示取反 ,不以26个大小写英文字母或者数字或者下划线或者短横线开头
量词符:用来设定某个模式出现的次数
*重复0次或多次 相当于>=0
var rg4 = /^a*$/;
+重复一次或更多次 相当于>=1
var rg4 = /^a+$/;
?重复0次或一次 相当于1||0
var rg4 = /^a?$/;
{n}重复n次
var rg4 = /^a{3}$/;//只有a重复3次 true
{n,}重复n次或更多次 相当于>=n
{n,m}重复n到m次 相当于大于等于n,小于等于m true
量词是设定某个模式出现的次数
var rg2 = /^[a-zA-Z-9_-]$/; //只能输入英文字符 数字 下划线 短横线 但是里面有边界符[ ],限定了只能选1个
console.log(rg2.test('a'));//true
console.log(rg2.test('8'));//true
console.log(rg2.test('58'));//false
var rg2 = /^[a-zA-Z-9_-]{5,12}$/; 5到12次之间
注意{5, 12}中间不要有空格
console.log(rg2.test('asdfffg-'));//true
console.log(rg2.test('dsfe_dc'));//true
console.log(rg2.test('asd!12345'));//false
var reg = /^abc{4}$/;// 让花括号前面的字重复4次 是让c重复4次 只有abcccc 为true
var reg = /^(abc)4}$/;// 让abc重复4次
console.log(reg.test('abcabcabc'));//true
预定义类
\d 匹配0-9之间的任一数字,相当于[0-9]
\D 匹配所有0-9以外的字符,相当于0-9
\w 匹配任意的字母、数字和下划线,相当于[A-Za-z0-9_]
\W 匹配所有的字母、数字和下划线以外的字符,相当于A-Za-z0-9_
\s 匹配空格(包括换行符、制表符、空格符等),相当于[\t\r\n\v\f]
\S 匹配非空格的字符,相当于\t\r\n\v\f
\b
匹配单词边界,通常匹配单词开头和结尾。如 /\bcd/
匹配 cdkey
。
\B
匹配非单词边界。如 /\Bcd/
匹配 abcd
。
\O
查找 NULL 字符。
\n
换行符。
\f
换页符。
\r
回车符。
\t
制表符。
\v
垂直制表符。
例如 座机号码验证 两种格式 000-12345678 或 1234-1234567
var reg = /^\d{3,4}-\d{7,8}$/
正则的替换 replace
<body> <textarea name="" id="message" style="height: 100px;width: 200px;"></textarea> <button>提交</button> <div></div> <script> var text = document.querySelector('textarea'); var btn = document.querySelector('button'); var div = document.querySelector('div'); btn.onclick = function() { // div.innerHTML = text.value.replace(/橘子/,'**');//只能替换第一个 div.innerHTML = text.value.replace(/橘子/g,'**');//全局匹配 // div.innerHTML = text.value.replace(/橘子|苹果|西瓜/g,'**');//多个词全局匹配 } </script> </body>
正则表达式参数
/表达式/[switch]
switch(也称修饰符)按照什么样的模式来匹配,有三种值:
g:全局匹配
i:忽略大小写
gi:全部匹配+忽略大小写
input输入框只能输入数字,只能输入字母数字组合
输入大小写字母、数字、下划线:
<input type="text" onkeyup="this.value=this.value.replace(/[^\w_]/g,'');">
输入小写字母、数字、下划线:
<input type="text" onkeyup="this.value=this.value.replace(/[^a-z0-9_]/g,'');">
输入数字和点
<input type="text" onkeyup="value=value.replace(/[^\d.]/g,'')">
输入中文:
<input type="text" onkeyup="this.value=this.value.replace(/[^\u4e00-\u9fa5]/g,'')">
输入数字:
<input type="text" onkeyup="this.value=this.value.replace(/\D/g,'')">
输入英文:
<input type="text" onkeyup="this.value=this.value.replace(/[^a-zA-Z]/g,'')">
输入中文、数字、英文:
<input onkeyup="value=value.replace(/[^\w\u4E00-\u9FA5]/g, '')">
输入数字和字母:
<input onKeyUp="value=value.replace(/[\W]/g,'')">
除了英文的标点符号以外,其他的都可以中文,英文字母,数字,中文标点
<input type="text" onkeyup="this.value=this.value.replace(/^[^!@#$%^&*()-=+]/g,'')">
只能输入数字代码(小数点也不能输入)
<input onkeyup="this.value=this.value.replace(/\D/g,'')" onafterpaste="this.value=this.value.replace(/\D/g,'')">
只能输入数字,能输小数点.
<input onkeyup="if(isNaN(value))execCommand('undo')" onafterpaste="if(isNaN(value))execCommand('undo')">
<input name=txt1 onchange="if(/\D/.test(this.value)){alert('只能输入数字');this.value='';}">
只能输入字母和汉字
<input onkeyup="value=value.replace(/[\d]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[\d]/g,''))" maxlength=10 name="Numbers">
onbeforepaste 意思是在用户执行粘贴动作之前。
clipboardData.setData('text', xxx) 是把xxx的内容复制到剪贴板
clipboardData.getData('text') 是读出当前剪贴板里的内容,
.replace(/[^\d]/g,'') 是正则替换,把里面除了数字以外的字符全部都去掉,
整个语句的功能是,每当用户执行粘贴操作前,先取出剪贴板的内容字符串,删除不是数字的字符,只保留数字,然后再粘贴,而不是直接粘贴
数字和小数点方法二
<input type=text t_value="" o_value=""
onkeypress="if(!this.value.match(/^[\+\-]?\d*?\.?\d*?/))
this.value=this.tvalue;
elsethis.tvalue=this.value;
if(this.value.match(/(?:[\+\-]?\d+(?:\.\d+)?)?/))
this.o_value=this.value"
onkeyup="if(!this.value.match(/^[\+\-]?\d*?\.?\d*?/))
this.value=this.tvalue;
elsethis.tvalue=this.value;
if(this.value.match(/(?:[\+\-]?\d+(?:\.\d+)?)?/))
this.o_value=this.value"
onblur="if(!this.value.match(/^(?:[\+\-]?\d+(?:\.\d+)?|\.\d*?)?$/))
this.value=this.o_value;else{if(this.value.match(/^\.\d+/))
this.value=0+this.value;if(this.value.match(/\./))
this.value=0;this.o_value=this.value}">
封装成单独的函数:
代码如下:
function keyPress(ob) {
if (!ob.value.match(/^[\+\-]?\d*?\.?\d*?/))ob.value=ob.tvalue;
elseob.tvalue=ob.value;
if(ob.value.match(/(?:[\+\-]?\d+(?:\.\d+)?)?/)) ob.o_value = ob.value;
}
function keyUp(ob) {
if (!ob.value.match(/^[\+\-]?\d*?\.?\d*?/))ob.value=ob.tvalue;
elseob.tvalue=ob.value;
if(ob.value.match(/(?:[\+\-]?\d+(?:\.\d+)?)?/)) ob.o_value = ob.value;
}
function onBlur(ob) {
if(!ob.value.match(/^(?:[\+\-]?\d+(?:\.\d+)?|\.\d*?)?$/))ob.value=ob.o_value;
else{if(ob.value.match(/^\.\d+/))ob.value=0+ob.value;
if(ob.value.match(/\./))ob.value=0;
ob.o_value=ob.value};
}
只需在调用,传入this对象即可!
只能输入英文字母和数字,不能输入中文
<input onkeyup="value=value.replace(/[^\w\.\/]/ig,'')">
只能输入数字和英文
<input onKeyUp="value=value.replace(/[^\d|chun]/g,'')">
小数点后只能有最多两位(数字,中文都可输入),不能输入字母和运算符号:
<input onKeyPress="if((event.keyCode<48 || event.keyCode>57) && event.keyCode!=46 || /\.\d\d$/.test(value))event.returnValue=false">
小数点后只能有最多两位(数字,字母,中文都可输入),可以输入运算符号:
<input onkeyup="this.value=this.value.replace(/^(\-)*(\d+)\.(\d\d).*$/,'$1$2.$3')">
一、校验数字的表达式
-
数字:^[0-9]*$
-
n位的数字:^\d{n}$
-
至少n位的数字:^\d{n,}$
-
m-n位的数字:^\d{m,n}$
-
零和非零开头的数字:^(0|
-
非零开头的最多带两位小数的数字:^(
-
带1-2位小数的正数或负数:^(-)?\d+(.\d{1,2})$
-
正数、负数、和小数:^(-|+)?\d+(.\d+)?$
-
有两位小数的正实数:^[0-9]+(.[0-9]{2})?$
-
有1~3位小数的正实数:^[0-9]+(.[0-9]{1,3})?$
-
非零的正整数:^[1-9]\d*或 或 ^+?
-
非零的负整数:^-
-
非负整数:^\d+或
-
非正整数:^-[1-9]\d*|0或
-
非负浮点数:^\d+(.\d+)?或
-
非正浮点数:^((-\d+(.\d+)?)|(0+(.0+)?))或
-
正浮点数:^[1-9]\d*.\d*|0.\d*[1-9]\d*或
-
负浮点数:^-([1-9]\d*.\d*|0.\d*[1-9]\d*)或
-
浮点数:^(-?\d+)(.\d+)?或
校验字符的表达式
-
汉字:^[\u4e00-\u9fa5]{0,}$
-
英文和数字:^[A-Za-z0-9]+或
-
长度为3-20的所有字符:^.{3,20}$
-
由26个英文字母组成的字符串:^[A-Za-z]+$
-
由26个大写英文字母组成的字符串:^[A-Z]+$
-
由26个小写英文字母组成的字符串:^[a-z]+$
-
由数字和26个英文字母组成的字符串:^[A-Za-z0-9]+$
-
由数字、26个英文字母或者下划线组成的字符串:^\w+或
-
中文、英文、数字包括下划线:^[\u4E00-\u9FA5A-Za-z0-9_]+$
-
中文、英文、数字但不包括下划线等符号:^[\u4E00-\u9FA5A-Za-z0-9]+或
-
可以输入含有^%&',;=?Missing superscript or subscript argument\x22]+**
-
禁止输入含有~的字符:[^~\x22]+
三、特殊需求表达式
-
Email地址:^\w+([-+.]\w+)*@\w+([-.]\w+)*.\w+([-.]\w+)*$
-
域名:
-
InternetURL:[a-zA-z]+://\s* 或 ^http://([\w-]+.)+[\w-]+(/[\w-./?%&=]*)?$
-
手机号码:^(13[0-9]|14[5|7]|15[0|1|2|3|4|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$
-
电话号码("XXX-XXXXXXX"、"XXXX-XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX):^((\d{3,4}-)|\d{3.4}-)?\d{7,8}$
-
国内电话号码(0511-4405222、021-87888822):\d{3}-\d{8}|\d{4}-\d{7}
-
电话号码正则表达式(支持手机号码,3-4位区号,7-8位直播号码,1-4位分机号): ((\d{11})|^((\d{7,8})|(\d{4}|\d{3})-(\d{7,8})|(\d{4}|\d{3})-(\d{7,8})-(\d{4}|\d{3}|\d{2}|\d{1})|(\d{7,8})-(\d{4}|\d{3}|\d{2}|\d{1}))$)
-
身份证号(15位、18位数字),最后一位是校验位,可能为数字或字符X:(^\d{15})|(^\d{17}(\d|X|x)$)
-
帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^
-
密码(以字母开头,长度在6~18之间,只能包含字母、数字和下划线):^[a-zA-Z]\w{5,17}$
-
强密码(必须包含大小写字母和数字的组合,不能使用特殊字符,长度在 8-10 之间):^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[a-zA-Z0-9]{8,10}$
-
强密码(必须包含大小写字母和数字的组合,可以使用特殊字符,长度在8-10之间):^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$
-
日期格式:^\d{4}-\d{1,2}-\d{1,2}
-
一年的12个月(01~09和1~12):^(0?[1-9]|1[0-2])$
-
一个月的31天(01~09和1~31):^((0?[1-9])|((1|2)[0-9])|30|31)$
-
钱的输入格式:
-
有四种钱的表示形式我们可以接受:"10000.00" 和 "10,000.00", 和没有 "分" 的 "10000" 和 "10,000":^
-
这表示任意一个不以0开头的数字,但是,这也意味着一个字符"0"不通过,所以我们采用下面的形式:^(0|
-
一个0或者一个不以0开头的数字.我们还可以允许开头有一个负号:^(0|-?
-
这表示一个0或者一个可能为负的开头不为0的数字.让用户以0开头好了.把负号的也去掉,因为钱总不能是负的吧。下面我们要加的是说明可能的小数部分:^[0-9]+(.[0-9]+)?$
-
必须说明的是,小数点后面至少应该有1位数,所以"10."是不通过的,但是 "10" 和 "10.2" 是通过的:^[0-9]+(.[0-9]{2})?$
-
这样我们规定小数点后面必须有两位,如果你认为太苛刻了,可以这样:^[0-9]+(.[0-9]{1,2})?$
-
这样就允许用户只写一位小数.下面我们该考虑数字中的逗号了,我们可以这样:^[0-9]{1,3}(,[0-9]{3})*(.[0-9]{1,2})?$
-
1到3个数字,后面跟着任意个 逗号+3个数字,逗号成为可选,而不是必须:^([0-9]+|[0-9]{1,3}(,[0-9]{3})*)(.[0-9]{1,2})?$
-
备注:这就是最终结果了,别忘了"+"可以用"*"替代如果你觉得空字符串也可以接受的话(奇怪,为什么?)最后,别忘了在用函数时去掉去掉那个反斜杠,一般的错误都在这里
-
-
xml文件:^([a-zA-Z]+-?)+[a-zA-Z0-9]+\.
-
中文字符的正则表达式:[\u4e00-\u9fa5]
-
双字节字符:[^\x00-\xff] (包括汉字在内,可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1))
-
-
HTML标记的正则表达式:<(\S*?)>*>.*?|<.*? /> ( 首尾空白字符的正则表达式:^\s*|\s*或) (可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式)
-
腾讯QQ号:
-
中国邮政编码:[1-9]\d{5}(?!\d) (中国邮政编码为6位数字)
-
IPv4地址: