常用的正则表达式

Posted 面条请不要欺负汉堡

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了常用的正则表达式相关的知识,希望对你有一定的参考价值。

    

首先推荐正则表达式编辑器: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 表示数字 \\d4 表示4个数字 
[] 表示或者 [/-] 表示 查找/ - 都可以 [0-9]查找任何从 0 至 9 的数字。
^表示开头 $表示结尾

   2030/01/22  20111-03-11 找日期格式  ^\\d4[/-]\\d2[/-]\\d2$


  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 || !/^\\d6(18|19|20)?\\d2(0[1-9]|1[012])(0[1-9]|[12]\\d|3[01])\\d3(\\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])?$)/;

 

以上是关于常用的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

常用正则表达式

HIVE常用正则表达式

常用正则表达式

常用正则表达式

常用-正则表达式

常用的正则表达式