JavaScript 正则表达式

正则表达式API:
http://www.w3school.com.cn/jsref/jsref_obj_regexp.asp
https://baike.baidu.com/item/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F/1700215?fr=aladdin
                             
什么是正则表达式?

        正则表达式(Regular Expression)是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
  简单来说:使用特定的符号所描述的一种规则,通常被用来检索、替换那些符合某个模式(规则)的文本

举例:
用户名只能输入 数字、字母、下划线 ,同时数字不可以作为开头, 同时长度必须在6-20之间
var str = username;
if( /^[a-zA-Z]\w+$/.test(str) ){
     //符合规则
}
为什么要使用正则表达式?

最主要的是 可以大量的节省验证的工作量,正则表达式的特点是:
1. 灵活性、逻辑性和功能性非常强;
2. 可以迅速地用极简单的方式达到字符串的复杂控制。
如何创建正则表达式?

第一种:
var reg = new RegExp("google", "gi");
第二种使用  /regstr/gi:
/google/gi.test(str)
reg  代表了一种规则
reg.test("xxxx")    代表了使用该规则对字符串进行校验

字符串的match方法

var pattern = /good/ig; 
var str = 'good good study!,day day up!';
console.log(str.match(pattern)); 
console.log(str.match(pattern).length); 

使用 search 来查找匹配数据
var pattern = /good/ig;
var str = 'good good study!,day day up!';
console.log(str.search(pattern));

使用 replace 替换匹配到的数据
var pattern = /Good/ig;
var str = 'good good study!,day day up!';
console.log(str.replace(pattern, 'hard')); 

日期处理
"2017&08&08".replace(/\d+\D/g, function(matched, index, str){
    //matched : 【2017&,08&】
    //index : 【0,5】
    return ""; //返回内容将替换匹配内容
})

"2017&08@08".replace(/(\d+)(\D)/g, function(matched, sub1,sub2, index, str){
    console.log(matched, sub1, sub2);  //【2017&,2017, &】【08@,08,@】
    return sub1+"-";
})

"2017&08@08".replace( /\D/g , "-" );
选择器
function $$(selector) {
	if(selector === undefined) return;
	var match = null;
	//#id
	if(match = selector.match(/^#(.+)/)) {
		return document.getElementById(match[1]);
	}
	//.class
	if(match = selector.match(/^\.(.+)/)) {
		return document.getElementsByClassName(match[1]);
	}
	//div
	if(match = selector.match(/^([a-zA-Z]+[0-9]?)$/)) {
		return document.getElementsByTagName(match[1]);
	}
	//div[index = 1]
	if(match = selector.match(/^([a-zA-Z]+[0-9]?)\[(.+)\=(.+)\]/)) {
		console.log(match);
		var eles = Array.from(document.getElementsByTagName(match[1].trim()));
		var res = eles.filter(function(item, index, arr) {
			return item.getAttribute(match[2].trim()) == match[3].trim();
		});
		return res;

	}
}

日期显示
setInterval(function(){
    var nowstr = new Date().toLocaleString();
    var res = null;
    var reg = /\d/g;
    var arr = [];
    while(res = reg.exec(nowstr) ){
        arr.push(res[0]);
    }
    console.log(arr)
},1000)

setInterval(function(){
    console.log( new Date().toLocaleString().match(/\d/g) );
},1000)

. 表示任意字符
var pattern = /g..gle/; 
var str = 'google';
console.log(pattern.test(str));


匹配次数问题
*        表示任意次 0 或多次
?       表示匹配1次或0次     
+        表示至少1次
{m,n}    表示m次到n次
{m,}     表示至少m次
{m}      表示匹配m次

字符匹配
[a-zA-Z0-9]    列举所有符合的情况,当情况过多时,使用-表示范围

   ^         开始
 $          结束
 \d        数字
 \D       非数字
 \w       数字字母下划线
 \W      非数字字母下划线
 \s       空白字符

校验是否全由数字组成
function isnumber(num){
    if(typeof num == "string" || typeof num == "number"){
        return /^\d+$/.test(num);
    } else {
        throw new Error("参数类型错误!,必须为数字或字符串");
    }
}

校验普通电话、传真号码:可以“+”开头,除数字外,可含有“-”
var reg = /^\+?(\d+-?)*\d+$/;
检查邮政编码     //共 6 位数字,第一位不能为 0
/^[1-9]\d{5}$/
检查文件压缩包  //xxx.zip\xxx.gz\xxx.rar\xxxx.7z\xxx.tar
/^.+\.(zip|gz|rar|7z|tar)$/

删除多余空格  //
str.replace( /\s+/g , "");

删除首尾空格
str.replace( /(^\s+)|(\s+$)/, "")
电子邮件( xxxxx @ xxxx(.xxxx)+)
/^[^@\s\?]+@[^@\s\?]+(\.[^@\s\?]+)+$/
      
手机号  1 3|5|8|7|4
/^1(3|5|8|7|4)\d{9}$/

身份证  
/\d{17}[0-9X]/

日期  (xxxx-xx-xx| xxxx/xx/xx | xxxx.xx.xx)
/\d{4}([-_\.#\s]\d{2}){2}/

  匹配中文
[\u2E80-\u9FFF]


账户名只能使用数字字母下划线,且数字不能开头,长度在6-15之间
/^[a-zA-Z_]\w{5,14}$/

将所有的bag、beg、big和bog改为bug
article.replace( /\sb[aeio]g\s/, " bug ");

将所有方法foo(a,b,c)的实例改为foo(b,a,c)
code.replace( /foo\(([^,]+),([^,]+),([^,]+)\)/, function(matched, g1, g2, g3){
    return "foo("+g2+","+g1+","+g3+")";
} )

假设有一个多字符的片断重复出现,例如:

Billy tried really hard
Sally tried really really hard
Timmy tried really really really hard
Johnny tried really really really really hard
而你想把"really"、"really really",以及任意数量连续出现的"really"字符串换成一个简单的"very"
str.replace(/(really\s)+/g,"very ");

练习
var myReg = /(\w+)\s(\w+)/i;
var str = "John Smith";
var newstr = str.replace(myReg, "$2 $1");

document.write(newstr);

//敏感词过滤
function strfilter(target) {
	var words = ["SB", "TMD", "WQNMLGB", "GCD", "89.64"];

	for(var i in words) {
		var reg = new RegExp(words[i], "gi");

		var stars = "";
		for(var k = 0; k < words[i].length; k++) {
			stars += "*";
		}

		return target.replace(reg, stars);
	}
}




  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值