JavaScript学习记录-正则表达式(3)

1、贪婪模式和惰性模式。

贪婪模式:如果符合要求就一直往后匹配,一直到无法匹配为止。

惰性模式:一旦匹配到合适的就结束,不在继续匹配下去了,

贪  婪

惰  性

+

+?

?

??

*

*?

{n}

{n}?

{n,}

{n,}?

{n,m}

{n,m}?

显而易见,多加一个?就由贪婪变惰性。

var pattern = /[a-f]+/;		//贪婪模式,+表示匹配至少一个[a-f]
var str = 'abcdef';
var result = str.replace(pattern, 'xxx');
alert(result);    //将所有都匹配,返回结果xxx


var pattern = /[a-f]+?/;    //?号关闭了贪婪模式,即开启了惰性模式
var str = 'abcdef';
var result = str.replace(pattern,'xxx');
alert(result);    //只替换了第一个,返回结果xxxbcdef

对于禁止贪婪模式的匹配,由于贪婪模式只匹配到第一个就返回,所以可以增加一个全局变量的参数的方法。

/*匹配88之间的字符串,(.+)代表了google,?代表只匹配第一个google*/
var pattern = /8(.+?)8/;	//惰性模式
var str = 'This is 8google8, That is 8google8, There is 8google8';
var result = str.replace(pattern,'<strong>$1</strong>');
document.write(result);	 //返回结果This is google, That is 8google8, There is 8google8,其中第一个google是加粗的


var pattern = /8(.+?)8/g;    //惰性模式加上全局变量参数g,变成了贪婪模式
var str = 'This is 8google8, That is 8google8, There is 8google8';
var result = str.replace(pattern,'<strong>$1</strong>');
document.write(result);  //返回结果This is google, That is google, There is google


var pattern = /8([^8]*)8/g;    //另一种表示方法
var str = 'This is 8google8, That is 8google8, There is 8google8';
var result = str.replace(pattern,'<strong>$1</strong>');
document.write(result);	

在写正则表达式时候,先写正则会比较混乱,更好的顺序是先写str字符串的表达式,再根据str写出正则pattern。

下面详解一个例子,

var pattern = /^[a-z]+\s[0-9]{4}$/;
var str = 'google 2018';
alert(pattern.exec(str));  //返回结果google 2018

先写str 'google 2018',根据str写出pattern,^代表首字符匹配,$代表行尾匹配,这限制了从str头尾开始匹配,第一个字符串google为字母[a-z],+代表至少匹配一个,\s匹配空格,2018是年份用[0-9]{4},代表匹配四个数字。

上例用分组实现,

var pattern = /^([a-z]+)\s([0-9]{4})$/i;	//使用分组
var str = 'google 2018';
alert(pattern.exec(str)[0]);	//返回结果google 2018
alert(pattern.exec(str)[1]);	//返回结果google
alert(pattern.exec(str)[2]);	//返回结果2018

而所谓的分组就是一对括号() ,每一对括号 就代表了一个分组,分组可以分为:(1) 捕获性分组,(2) 非捕获性分组,(3) 前瞻捕获性分组,

(1) 捕获性分组()

捕获性分组工作模式()会把每个分组里匹配的值保存起来。譬如,利用捕获性分组把 hello world 互换成 world hello,

方法一:通过exec函数,

var str = "Hello World";	//创建好字符串
var pattern = /([a-z]+)\s([a-z]+)/i;	//通过正则表达式匹配这个字符串,用分组模式来获取两个字符串
var arr = pattern.exec(str);	//exec方法返回的是一个数组,包含匹配到的字符串以及分组(也称子串)里的值
alert(arr);
alert(arr[0]);
alert(arr[1]);
alert(arr[2]);
//这时候两个分组的值都得到了,接下来用字符串拼接法实现互换
var result = arr[2]+' '+arr[1];
alert(result);

方法二:通过属性$1-9

var str = "Hello World";	//创建好字符串
var pattern = /([a-z]+)\s([a-z]+)/i;	//通过正则表达式匹配这个字符串,用分组模式来获取两个字符串
pattern.exec(str);	//这个地方必须运行正则匹配一次,方式不限,可以是test()、exec()、以及String的正则方式
	
alert(RegExp.$1);
alert(RegExp.$2);
	
var result = RegExp.$2+' '+RegExp.$1;
alert(result);

方法三:通过String的replace()

var str = 'Hello World'; 
var pattern = /([a-z]+)\s([a-z]+)/i; 
var result = str.replace(pattern,"$2 $1"); //这里的$1、$2与方法二里的RegExp.$1、RegExp.$2作用是相同的。
console.log(result) //world hello

(2) 非捕获性分组:(?:)

非捕获性分组工作模式下分组(?:)会作为匹配校验,并出现在匹配结果字符里面,但不作为子匹配返回。譬如利用非捕获性分组获取字符串000aaa111,而且只返回一个值为aaa111的数组,

/*捕获性分组*/
var str = "000aaa111";
var pattern = /([a-z]+)([0-9]+)/;
var result = pattern.exec(str);
alert(result);	//返回结果aaa111,aaa,111

/*非捕获性分组*/
var str = "000aaa111";
var pattern = /(?:[a-z]+)(?:[0-9]+)/;
var result = pattern.exec(str);
alert(result);	//返回结果aaa111

(3) 前瞻捕获性分组(?=)

var str = 'google';
var pattern = /(goo(?=gle))/;	//goo后面必须跟着gle才能捕获
alert(pattern.exec(str));	//返回结果goo,goo,如果goo后面不是gle返回null

另外,对于一些特殊字符的匹配,用 \ 符号转义即可。

2、常用的正则表达式

(1) 检查邮政编码,编码要求共6位数字,第一位不能为0,譬如邮政编码215000

var str = "215000";
var pattern = /[1-9][0-9]{5}/;
alert(pattern.test(str));

(2) 检查文件压缩包

var str = "1417404020.zip";
var pattern = /[\w]+\.zip|rar|gz/;
alert(pattern.test(str));
//\w代表匹配字母和数字及_   \.转义.符号   压缩文件名大致分这几种,几选一

(3) 删除多余空格

var str = "111 222 333";
var pattern = /\s/g;    //\s匹配空格符,必须使用全局
var result = str.replace(pattern,"");
alert(result);

(4) 只删除首尾的空格

/*方式一*/
var str = "   goo  gle   ";
var pattern = /^\s+/;    //强制首
var result = str.repalce(pattern,"");

pattern = /\s+$/;       强制尾,在首做完的基础上做尾
result = result.replace(pattern,"");
alert(result);    //实验证明此方法如果首尾一起做会出错


/*方式二*/
var str = "   goo  gle   ";
var pattern = /^\s*(.+?)\s*$/;    //用非贪婪捕获,分组保护起中间不变的部分
alert(pattern.exec(str));


/*方式三*/
var str = "   goo  gle   ";
var pattern = /^\s*(.+?)\s*$/;
var result = str.replace(pattern,"$1");    //    用分组获取
alert(result);

(5) 电子邮件验证

var str = "bert.zuo@spil.com";
var pattern = /^([a-zA-Z0-9_\.\-]+)@([a-zA-Z0-9_\.\-]+)\.([a-zA-Z]{2,4})$/;
alert(pattern.test(str));

//正则表达式也可以:/^([\w\.\-]+)@([\w\.\-]+)\.([\w]{2,4})$/

note:实际的电子邮件的验证远远比这个复杂的多。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值