常用的正则表达式

    

首先推荐正则表达式编辑器:https://regexper.com/

 

一.正则表达式的使用

(1).正则表达式修饰符

 

字符      含义
i        执行不区分大小写的匹配
g        执行一个全局匹配,即找到所有匹配而非一次匹配
m        多行匹配模式,^匹配一行的开头和字符串开头,$匹配行的结束和字符串的结尾

 

(2).方法

A.RegExp的方法

RegExp 对象有 3 个方法:test()、exec() 以及 compile()。

 

test():检索字符串中的指定值。返回值是布尔值。
exec():返回一个数组,数组中的第一个条目是第一个匹配,其他的是反向引用
compile() 既可以改变检索模式,也可以添加或删除第二个参数。 

 

B.String 对象中的正则表达式方法

(3).使用

A.RegExp()------匹配是否合法

//匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线

 

     var val = 'aaaa';
     var  re = new RegExp("^[a-zA-Z][a-zA-Z0-9_]{5,19}$");
    if(re.test(val)){
      console.log("结果:格式正确");
    }else{
   		console.log("结果:格式错误");
    }

 

B.match() ----  获取匹配数组

 

var pattern = /box/ig;//全局搜索 
		var str = 'This is a Box!,That is a Box too'; 
		console.log(str.match(pattern)); //匹配到两个 Box,Box  (2) ["Box", "Box"]
		console.log(str.match(pattern).length);//获取数组的长度  2

 

C.search()---- 查找匹配数据

 

var pattern = /box/ig;
		var str = 'This is a Box!,That is a Box too'; 
		if(str.search(pattern)=='-1'){
			console.log('没找到')
		}else{
			console.log(str.search(pattern));//查找到,返回位置  10
		}

 

D.replace()------ 替换匹配到的数据

 

var pattern = /box/ig;
		var str = 'This is a Box!,That is a Box too'; 
		console.log(str.replace(pattern, 'Cat'));//This is a Cat!,That is a Cat too

 

E.split ()-----拆分成字符串数组

 

var pattern = / /ig;
 var str = 'This is a Box!,That is a Box too';         
 console.log(str.split(pattern));//将空格拆开分组成数组   
 //(8) ["This", "is", "a", "Box!,That", "is", "a", "Box", "too"]

 

F.exec() ----统计子字符串出现的所有位置

 

function count(str){
    var b,r=/def/g;
    while(b = r.exec(str)){
        console.log(b);
    }
}
count('abcdefabcdefabcdefabcdef');


输出:
[ 'def', index: 3, input: 'abcdefabcdefabcdefabcdef' ]
[ 'def', index: 9, input: 'abcdefabcdefabcdefabcdef' ]
[ 'def', index: 15, input: 'abcdefabcdefabcdefabcdef' ]
[ 'def', index: 21, input: 'abcdefabcdefabcdefabcdef' ]

2.练习 常见

(1).

· 任意字符
\ 转义字符(比如 要表示只是单纯的点.而不是表示其他含义则\. 此时这个就是表示点 )
() 表示分组 就是一个组合

  http://www.baidu.com https://www.ssbaidu.com 

    现在要的是http:后面东西
    http:(\/\/.+\.com)  

2. 

\d 表示数字 \d{4} 表示4个数字 
[] 表示或者 [/-] 表示 查找/ - 都可以 [0-9]查找任何从 0 至 9 的数字。
^表示开头 $表示结尾

   2030/01/22  20111-03-11 找日期格式  ^\d{4}[/-]\d{2}[/-]\d{2}$


  3.实例化

a.字面量 var reg=\/bis/b\g;

\b 单词边界,也就是指单词和空格间的位置 

/正则表达式/  这个表示是一个正则表达式(正则表达式被包在两个'/'之间)

在正则表达式最后写上g(/???/g)为全局匹配,否则只匹配模式串中第一个合适的元素

 
 /\bsi\b/  表示“ is ”

i: 忽略大小写

'he is a boy. Is a dog'.replace(/\bsi\b/gi,'1');// 输出  he 1 a boy. 1 a dog

m: 多行搜索

var reg = /\bsi\b/;

'he is a boy. This is a dog'.replace(reg,'IS');// 输出  he IS a boy. This is a dog

var reg = /\bsi\b/g;

'he is a boy. This is a dog'.replace(reg,'IS');// 输出  he IS a boy. This IS a dog

B.构造函数 var reg=new RegExp('\\bis\\b'); 第一个   var reg=new RegExp('\\bis\\b','g'); 全局替换

4.元字符 字符类 范围类

元字符 
 
正则表达式由2种基本字符类型组成:

    1.原义文本字符:代表它原来含义的字符 例如:abc就是表示abc
    2.元字符:在正则表达式中有特殊意义的非字母字符 例如:\b表示匹配单词边界,而非\b

 在正则表达式中具体特殊含义的字符:* + ? $ ^ . \ () {} []

\t    水平制表符(Tab?)

\v   垂直制表符

\n   换行符号

\r    回车符

\0   空字符

\f    换页符
\cX   与X对应的控制字符


字符类

  一般情况下正则表达式一个字符对应字符串一个字符

    表达式 ab\t 的含义是: 一个字母a一个字母b加一个水平制表符 

  可以使用元字符[]来构建一个简单的类,所谓类是指符合某些特征的对象,一个泛指,而不是特指某个字符

    表达式[abc]:把字符 a 或 b 或 c 归为一类,表达式可以匹配这类的字符,即匹配abc中的

 ^ 是反向类、 不属于某类的内容 如:[ ^abc] 表示查询的内容不属于a 或是b 或c


范围类:一个区间
  
[a-z]:a到z的任意字符,包含a和z本身
[a-zA-Z];大小写都可以


预定义类:  匹配一个 ab +数字+任意字符的字符串  ab\d.

. ([^\r\n])  初了回车符合换行符
\d([0-9]) 数字字符  \D[^0-9] 非数字字符  
\s([\t\n\x0B\f\r]) 空白符 , \S ([^\t\n\x0B\f\r])非空白符 , 
\w ([a-zA-Z_0-9])单词字符(字母 ,数字 下划线) , \W ([^a-zA-Z_0-9])非单词字符

5.边界


边界

^ 以xxx 开始
$ 以XXX结束
\b 单词边界
\B 非单词边界

二.常用的正则表达式

1.手机号码(包含177开头)

tip:      /^[1][3,4,5,7,8][0-9]{9}$/

2.电子邮件

tip:^[A-Za-z0-9\u4e00-\u9fa5]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$

或是:^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$

3.正则表达式校验url必须以http或https开头

var regex = /(http|https):\/\/([\w.]+\/?)\S*/;

3.身份证

//身份证号合法性验证 
//支持15位和18位身份证号
//支持地址编码、出生日期、校验位验证
function IdentityCodeValid(code) { 
    var city={11:"北京",12:"天津",13:"河北",14:"山西",15:"内蒙古",21:"辽宁",22:"吉林",23:"黑龙江 ",31:"上海",32:"江苏",33:"浙江",34:"安徽",35:"福建",36:"江西",37:"山东",41:"河南",42:"湖北 ",43:"湖南",44:"广东",45:"广西",46:"海南",50:"重庆",51:"四川",52:"贵州",53:"云南",54:"西藏 ",61:"陕西",62:"甘肃",63:"青海",64:"宁夏",65:"新疆",71:"台湾",81:"香港",82:"澳门",91:"国外 "};
    var tip = "";
    var pass = true;
    if(!code || !/^\d{6}(18|19|20)?\d{2}(0[1-9]|1[012])(0[1-9]|[12]\d|3[01])\d{3}(\d|X)$/i.test(code)){
        tip = "身份证号格式错误";
        pass = false;
    }

   else if(!city[code.substr(0,2)]){
        tip = "地址编码错误";
        pass = false;
    }
    else{
        //18位身份证需要验证最后一位校验位
        if(code.length == 18){
            code = code.split('');
            //∑(ai×Wi)(mod 11)
            //加权因子
            var factor = [ 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 ];
            //校验位
            var parity = [ 1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2 ];
            var sum = 0;
            var ai = 0;
            var wi = 0;
            for (var i = 0; i < 17; i++)
            {
                ai = code[i];
                wi = factor[i];
                sum += ai * wi;
            }
            var last = parity[sum % 11];
            if(parity[sum % 11] != code[17]){
                tip = "校验位错误";
                pass =false;
            }
        }
    }
    codePass = pass;
    console.log(pass)
}

4.js控制input框只能输入数字和一位小数点且小数点后面只有两位小数
 

<input type="text" onkeyup="clearNoNum(this)">
<script language="JavaScript" type="text/javascript"> 
function clearNoNum(obj){ 
    obj.value = obj.value.replace(/[^\d.]/g,"");  //清除“数字”和“.”以外的字符  
    obj.value = obj.value.replace(/\.{2,}/g,"."); //只保留第一个. 清除多余的  
    obj.value = obj.value.replace(".","$#$").replace(/\./g,"").replace("$#$","."); 
    obj.value = obj.value.replace(/^(\-)*(\d+)\.(\d\d).*$/,'$1$2.$3');//只能输入两个小数  
    if(obj.value.indexOf(".")< 0 && obj.value !=""){//以上已经过滤,此处控制的是如果没有小数点,首位不能为类似于 01、02的金额 
        obj.value= parseFloat(obj.value); 
    } 
} 
</script>  

 

三.字符串截取

1.slice()

第一个参数代表开始位置,第二个参数代表结束位置的下一个位置,截取出来的字符串的长度为第二个参数与第一个参数之间的差;若参数值为负数,则将该值加上字符串长度后转为正值;若第一个参数等于大于第二个参数,则返回空字符串

2.substring()
第一个参数代表开始位置,第二个参数代表结束位置的下一个位置;若参数值为负数,则将该值转为0;两个参数中,取较小值作为开始位置,截取出来的字符串的长度为较大值与较小值之间的差.用于提取字符串中介于两个指定下标之间的字符。

var s='2018020714:06:10'
var date=s.substring(0, 4)+ "-" +s.substring(4, 6)+ "-" +s.substring(6, 8)+ " " +s.substring(8, 16);
console.log(date)//2018-02-07 14:06:10

3.substr()

第一个参数代表开始位置,第二个参数代表截取的长度

var stmp = "rcinn.cn";
//使用一个参数
console.log(stmp.slice(3));//从第4个字符开始,截取到最后个字符;返回"nn.cn"
console.log(stmp.substring(3));//从第4个字符开始,截取到最后个字符;返回"nn.cn"


//使用两个参数
console.log(stmp.slice(1,5))//从第2个字符开始,到第5个字符;返回"cinn"
console.log(stmp.substring(1,5));//从第2个字符开始,到第5个字符;返回"cinn"


//如果只用一个参数并且为0的话,那么返回整个参数
console.log(stmp.slice(0));//返回整个字符串
console.log(stmp.substring(0));//返回整个字符串

//在上面的例子中我们可以看出slice()和substring()的用法是相同的
//返回的值也是一样的,但当参数为负数时,他们的返回值却不一样,看下面的例子
console.log(stmp.slice(2,-5));//返回"i"
console.log(stmp.substring(2,-5));//返回"rc"
//从上面两个例子可以看出slice(2,-5)实际上是slice(2,3)
//负5加上字符串长度8转换成正3(若第一位数字等于或大于第二位数字,则返回空字符串);
//而substring(2,-5)实际上是substring(2,0),负数转换为0,substring总是把较小的数作为起始位置。

console.log(stmp.substring(1,5))//从第2个字符开始,到第5个字符;返回"cinn"
console.log(stmp.substr(1,5));//从第2个字符开始,截取5个字符;返回"cinn."

var str = "0123456789"; console.log(str.substr(5)); //输出56789
var strs = "abce1222"; console.log(strs.substr(5));//输出 222

4.split() 

使用一个指定的分隔符把一个字符串分割存储到数组 

var str2="jpg|bmp|gif|ico|png"; console.log(str2.split("|"))
输出 ["jpg", "bmp", "gif", "ico", "png"]

 

四.例子

1.只提取汉字  

function GetChinese(strValue) {  
    if(strValue!= null && strValue!= ""){  
        var reg = /[\u4e00-\u9fa5]/g;   
        return strValue.match(reg).join("");  
    }  
    else  
        return "";  
}  
2.去掉汉字  
function RemoveChinese(strValue) {  
    if(strValue!= null && strValue != ""){  
        var reg = /[\u4e00-\u9fa5]/g;   
       return strValue.replace(reg, "");   
    }  
    else  
        return "";  
}  

3.只能整数

1.只能输入是 0 ~ 100
var reg = /^(?:[1-9]?\d|100)$/;

2.只能输入正数
var reg =/^[1-9]\d*$/;

3.正确的金额格式
var reg = /(^[1-9]([0-9]+)?(\.[0-9]{1,2})?$)|(^(0){1}$)|(^[0-9]\.[0-9]([0-9])?$)/;

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值