正则表达式(常用正则总结)

正则在线测试工具https://c.runoob.com/

正则表达式的特点

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-9*)$

  • 非零开头的最多带两位小数的数字:^(1-9*)+(.[0-9]{1,2})?$

  • 带1-2位小数的正数或负数:^(-)?\d+(.\d{1,2})$

  • 正数、负数、和小数:^(-|+)?\d+(.\d+)?$

  • 有两位小数的正实数:^[0-9]+(.[0-9]{2})?$

  • 有1~3位小数的正实数:^[0-9]+(.[0-9]{1,3})?$

  • 非零的正整数:^[1-9]\d* 或 ^+?1-9*$

  • 非零的负整数:^-1-90-9"*

  • 非负整数:^\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+)*$

  • 域名:a-zA-Z0-9{0,62}(.a-zA-Z0-9{0,62})+.?

  • 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字节,允许字母数字下划线):^a-zA-Z{4,15}$

  • 密码(以字母开头,长度在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)$

  • 钱的输入格式:

    1. 有四种钱的表示形式我们可以接受:"10000.00" 和 "10,000.00", 和没有 "分" 的 "10000" 和 "10,000":^1-9*$

    2. 这表示任意一个不以0开头的数字,但是,这也意味着一个字符"0"不通过,所以我们采用下面的形式:^(0|1-9*)$

    3. 一个0或者一个不以0开头的数字.我们还可以允许开头有一个负号:^(0|-?1-9*)$

    4. 这表示一个0或者一个可能为负的开头不为0的数字.让用户以0开头好了.把负号的也去掉,因为钱总不能是负的吧。下面我们要加的是说明可能的小数部分:^[0-9]+(.[0-9]+)?$

    5. 必须说明的是,小数点后面至少应该有1位数,所以"10."是不通过的,但是 "10" 和 "10.2" 是通过的:^[0-9]+(.[0-9]{2})?$

    6. 这样我们规定小数点后面必须有两位,如果你认为太苛刻了,可以这样:^[0-9]+(.[0-9]{1,2})?$

    7. 这样就允许用户只写一位小数.下面我们该考虑数字中的逗号了,我们可以这样:^[0-9]{1,3}(,[0-9]{3})*(.[0-9]{1,2})?$

    8. 1到3个数字,后面跟着任意个 逗号+3个数字,逗号成为可选,而不是必须:^([0-9]+|[0-9]{1,3}(,[0-9]{3})*)(.[0-9]{1,2})?$

    9. 备注:这就是最终结果了,别忘了"+"可以用"*"替代如果你觉得空字符串也可以接受的话(奇怪,为什么?)最后,别忘了在用函数时去掉去掉那个反斜杠,一般的错误都在这里

  • xml文件:^([a-zA-Z]+-?)+[a-zA-Z0-9]+\.x|X[l|L]$

  • 中文字符的正则表达式:[\u4e00-\u9fa5]

  • 双字节字符:[^\x00-\xff] (包括汉字在内,可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1))

  • 空白行的正则表达式:\n\s*\r (可以用来删除空白行)

  • HTML标记的正则表达式:<(\S*?)>*>.*?|<.*? /> ( 首尾空白字符的正则表达式:^\s*|\s*) (可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式)

  • 腾讯QQ号:1-9{4,} (腾讯QQ号从10000开始)

  • 中国邮政编码:[1-9]\d{5}(?!\d) (中国邮政编码为6位数字)

  • IPv4地址:((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})(.((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})){3}

posted @ 2021-02-20 11:51  ℳℓ马温柔  阅读(928)  评论(0编辑  收藏  举报