正则表达式

1.g标志

   g标志一般是与match和exec来连用,否则g标志没有太大的意义,先来看一个带g标志的例子:

var str = "tankZHang (231144) tank ying (155445)";    
var res = str.match(/tank/);         //没有加/g    
console.log(res);                    
//返回一个数组,数组有三个成员,一个是匹配的对象、在一个index:0(匹配到的位置)和input(原字符串) ,如果匹配不了,返回为NULL
["tank", index: 0, input: "tankZHang (231144) tank ying (155445)"]
res = str.match(/tank/g);            //加了/g   
// 返回一个数组,数组包含匹配了几个tank
console.log(res);                    //显示为tank,tank

那么我们知道g的标志是:我是一个全局标志符,我要告诉处理字符串函数是单个处理字符串还是全局处理字符串。

通过刚刚的测试可以知道:

当正则含有g标志时,全局查找,结果数组的元素0到n中包含所有匹配。

没有g标志时:数组有三个成员,一个是匹配的对象、在一个index:0(匹配到的位置)和input(原字符串)。

2.exec函数

 先来看一个例子:

1 var str = "tankZHang (231144) tank ying (155445)";    
2 var res = /tank/.exec(str);         //没有加/g
3 console.log(res);                    
4 res = /tank/g.exec(str);            //加了/g
5 console.log(res);                   
6 //显示结果,两者一样,和match不带有g标志三者相同
7 //["tank", index: 0, input: "tankZHang (231144) tank ying (155445)"]
8 //["tank", index: 0, input: "tankZHang (231144) tank ying (155445)"]

那么exec的作用是什么?在正则表达式,在有全局标志的情况下:

var objStr = "我的手机号13522222222,他的手机号13288888888,她的手机号码13699999999";
var reg = /13(\d)(\d{8})/g; 
console.log("reg="+ reg.lastIndex);
var arr = reg.exec(objStr); 
console.log(reg.lastIndex);
console.log(arr);
//reg=0  初始lastIndex
//16     第一次匹配之后lastIndex调整为16
//["13522222222", "5", "22222222", index: 5, input: "我的手机号13522222222,他的手机号13288888888,她的手机号码13699999999"]
//"5"和"22222222"为第一个匹配的两个分组

如果我们需要获取匹配所有的详细信息可以通过patt.exec(str)来获得例如:

var str = "Visit W3School, W3School is a place to study web technology."; 
var patt = new RegExp("W3School","g");
var result;

while ((result = patt.exec(str)) != null)  {
  document.write(result);
  document.write("<br />");
  document.write(patt.lastIndex);
  document.write("<br />");
 }
// W3School
// 14
// W3School
// 24

 每一个Regexp对象有个source成员:指向该正则表达式。

3.匹配前端静态文件

/\.((png|jpe?g|gif|svg)|(woff2?|eot|ttf|otf)|js|css)(\?.*)?$/;

4.正则表达式(前瞻,后瞻,非捕获性分组,惰性量词)

4.1 前瞻

符号是?=,例如:

var xx="abcde";
xx= xx.split(new RegExp('(?=a)|d'));
//“?=a”表示以a前面进行分割,new RegExp('(?=a)|d')表示以a前面的字符串或者d进行分割。
//结果是:xx[0]=abc;xx[1]=d。
//另一个例子
var regex = /(bed(?=room))/,  //匹配bed的后面是room
     str1="bedroom",
     str2 ="roombed";
console.log(regex.test(str1));   //true;
console.log(regex.test(str2));   //false;

4.2 后瞻

符号是?!,相对于前瞻的反面

var regex = /(bed(?!room))/,
     str1="bedroom",
     str2 ="bedxxx";
console.log(regex.test(str1));   //false;  bed的后面有room为false,其他为true。
console.log(regex.test(str2));   //true;

现在有更高级的搞法。\B+(边界)。\b+(非边界)。

var regex = /\B(room)/;
var str1="bedroom";
var str2 ="bedxxx";
console.log(str1.replace(regex,'-$1'));   //bed-room
console.log(regex.test(str2));   //false; 

4.3 非捕获性分组

符号是: 括号前面加个?:

var regex = /windows (?:98|2000|2003)/;
console.log("windows 2003".match(regex)); //没有分组这个概念
//["windows 2003", index: 0, input: "windows 2003"]
var regex = /windows (98|2000|2003)/;
console.log("windows 2003".match(regex));
//["windows 2003", "2003", index: 0, input: "windows 2003"]

4.4惰性量词

贪婪量词?  * + {n} {n,} {n, m},惰性量词就是贪婪量词的后面加个‘?’,例如:

var str = "abbbaabbbaaabbb1234";
var patt1 = /.*bbb/g; //贪婪的 得到结果 ["abbbaabbbaaabbb"]
var patt2 = /.*? bbb/g; //惰性的 得到结果 
//["abbb", "aabbb", "aaabbb"]

获取一级域名:

var url = require('url');
var myUrl = url.parse("http://n.51blb.com");
console.log(myUrl.hostname.replace(/^[\S^\.]*?\./,""));
//51blb.com

 

推荐一个在线验证正则表达式的网站:

   https://regexper.com/

 

posted @ 2016-12-02 15:26  anthonyliu  阅读(810)  评论(0编辑  收藏  举报