好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

精通正则表达式(JavaScript)

精通正则表达式(JavaScript)

 在上一篇 精通正则表达式(正则引擎) 中大概的讲解了一下正则引擎的相关知识,了解了它的匹配原理,接下来我们在js这门语言里面来详细的使用一下。

  在js中常用于字符串处理、表单验证、处理DOM模型、纯编程逻辑等。js中的正则表达式使用方式提供了两种:普通方式;构造函数方式。

   普通方式

  普通方式:var reg=/表达式/附加参数
  表达式:一个字符串,代表了某种规则,其中可以使用某些特殊字符来代表特殊的规则。
  附加参数:用来扩展表达式的含义,目前主要有三个参数:
    g:代表可以进行全局匹配。
    i:代表不区分大小写匹配。
    m:代表可以进行多行匹配。
  上面三个参数可以任意组合,代表符合含义,当然也可以不加参数。
  例如:
    var reg1=/[0-9]*b/;
    var reg2=/[a-z]+f/g;
    var reg3=/^[a-z]/i;
    var reg4=/^[a-z]/gm;

   构造函数方式  

  构造函数方式:var reg=new RegExp(“表达式”,”附加参数”);
  其中的表达式和附加参数和普通方式一样。
  例如:var reg1=new RegExp(“a|b”);
    var reg2=new RegExp(“[a-z]$”,”i”);

  普通方式的的表达式必须是一个常量字符串,而构造函数中的表达式可以是常量字符串,也可以是一个js变量,例如:
    var value=“abc”;
    var reg=new RegExp(value,”i”);

  如下为js的其他部分元字符:

   1、表达式操作

   1.1exec

  exec(str),返回str中与表达式相匹配的第一个字符串,而且以数组的形式表现,当然如果表达式中含有捕捉用的小括号,则返回的数组中也可能含有()中的匹配字符串,例如:
    var regx=/\d+/; 
    var rs=regx.exec(“3432ddf53”); 
  返回的rs值为:{3432}
    var regx2=new RegExp(“ab(\d+)c”); 
    var rs2=regx2.exec(“ab234c44”); 
  返回的rs值为:{ab234c,234}

  另外,如果有多个合适的匹配,则第一次执行exec返回一个第一个匹配,此时继续执行exec,则依次返回第二个第三个匹配。例如: 
    var regx=/user\d/g;
    var rs=regx.exec(“ddduser1dsfuser2dd”); 
    var rs1=regx.exec(“ddduser1dsfuser2dd”); 
  则rs的值为{user1},rs的值为{user2},当然注意regx中的g参数是必须的,否则无论exec执行多少次,都返回第一个匹配  

View Code

   1.2test  

  test(str),判断字符串str是否匹配表达式,返回一个布尔值。例如:
    var regx=/user\d+/g; 
    var flag=regx.test(“user12dd”); 
  flag的值为true。

View Code

   1.3match  

  match(expr),返回与expr相匹配的一个字符串数组,如果没有加参数g,则返回第一个匹配,加入参数g则返回所有的匹配 例子:
    var regx=/user\d/g;
    var str=“user13userddduser345”; 
    var rs=str.match(regx); 
  rs的值为:{user1,user3} 

View Code

   1.4search  

View Code

   1.5replace  

  replace(expr,str),将字符串中匹配expr的部分替换为str。另外在replace方法中,str中可以含有一种变量符号$,格式为$n,代表匹配中被记住的第n的匹配字符串(注意小括号可以记忆匹配)。 例子1: 
    var regx=/user\d/g; 
    var str=“user13userddduser345”;
    var rs=str.replace(regx,”00”); 
  rs的值为:003userddd0045 

  例子2:
    var regx=/u(se)r\d/g; 
    var str=“user13userddduser345”; var rs=str.replace(regx,”$1”); 
  rs的值为:se3userdddse45 

View Code

   1.6split  

  split(expr),将字符串以匹配expr的部分做分割,返回一个数组,而且表达式是否附加参数g都没有关系,结果是一样的。 例子:
    var regx=/user\d/g; 
    var str=“user13userddduser345”; 
    var rs=str.split(regx); 
  rs的值为:{3userddd,45}

View Code

   2、表达式相关属性

   2.1lastIndex   

  lastIndex,返回开始下一个匹配的位置,注意必须是全局匹配(表达式中带有g参数)时,lastIndex才会有不断返回下一个匹配值,否则该值为总是返回第一个下一个匹配位置,例如:     var regx=/user\d/;
    var rs=regx.exec(“sdsfuser1dfsfuser2”); 
    var lastIndex1=regx.lastIndex; rs=regx.exec(“sdsfuser1dfsfuser2”);
    var lastIndex2=regx.lastIndex; rs=regx.exec(“sdsfuser1dfsfuser2”); 
    var lastIndex3=regx.lastIndex; 
  上面lastIndex1为0,第二个lastIndex2也为0,第三个也是0;如果regx=/user\d/g,则第一个为9,第二个为18,第三个为0。

View Code

   2.2source  

  source,返回表达式字符串自身。例如:
    var regx=/user\d/; 
    var rs=regx.exec(“sdsfuser1dfsfuser2”); 
    var source=regx.source; 
  source的值为user\d

   2.3index   

  index,返回当前匹配的位置。例如: 
    var regx=/user\d/; 
    var rs=regx.exec(“sdsfuser1dfsfuser2”); 
    var index1=rs.index; rs=regx.exec(“sdsfuser1dfsfuser2”); 
    var index2=rs.index; 
    rs=regx.exec(“sdsfuser1dfsfuser2”); 
    var index3=rs.index; 
  index1为4,index2为4,index3为4,如果表达式加入参数g,则index1为4,index2为13,index3会报错(index为空或不是对象)。

   2.4input

  input,用于匹配的字符串。例如: 
    var regx=/user\d/; 
    var rs=regx.exec(“sdsfuser1dfsfuser2”); 
    var input=rs.input; 
  input的值为sdsfuser1dfsfuser2。

   2.5[0]

   3实战

   3.1   

   答案(不止一个,这只是其中一个):

View Code

   3.2

  前几天遇到一个朋友在群里面问一个问题:他有形如:"[{chk:'-15-13-2-5-'},{chk:'-1-13-4-5-2-'},{chk:'-1-2-5-'}]"这样的很长的字符串数据,在界面用户选择了"-5-"、"-2-"等里面的若干个,那么希望获取出"{chk:'...'}"这样的数据,里面必须同时存在用户选择的所有选项。不如用户在界面勾选了"-5-"和"-4-",那么最后只有{chk:'-1-13-4-5-2-'}满足条件。

  答案: 

View Code

  希望对大家有所帮助吧!

 

 

 

标签:  js ,  正则表达式

js自定义事件的简单实现

在写这段代码之后,本人使用过jQuery这个库,一直对jQuery的自定义事件有疑惑,就看了看jQuery的源码,廓然开朗。

jQuery代码实现和触发自定义实现如下: 

 jQuery的定义方式:
$(dom).bind( 'data-change', function (){ //  dom为一个html元素 
      alert("asd" );     
})

jQuery使用方式 : 
$(dom).trigger( 'init-change',[data]);

但内部机制是怎么触发这个事件的呢?原来jQuery通过的是缓存这些自定义事件,我就自己实现了一把,下面是我的代码:

 var  Dojo =  function  (selecter,context){
      return   new   this .init(selecter,context); //  创建一个新的对象 
 }
Dojo.prototype.event  =  {};
Dojo.prototype.init   =  function  (selecter,context){
      this .gid = 0 ;
      var  dom  =  this  .getDom(selecter); 
      this .dom =  dom;
      this .dom.gid =  this .gid++ ;
      return   this  ;
}
Dojo.prototype.getDom  =   function  (selecter){
      var  dom = document.getElementById(selecter) ||  null  ;
      return   [dom];
}
Dojo.prototype.addEvent  =  function (eventName,fn){ //  存放自定义的事件 
     if (! this  .event[eventName]){
          this .event[eventName] =  [];
    }
      this  .event[eventName].push( fn );
}
  //  Dojo工具类 
Dojo.Util =  {};
Dojo.Util.isFunction  =  function  (fn){
      return  Object.prototype.toString.call( fn ).slice(8,-1) === 'Function' ;
}
Dojo.Util.ToArray  =  function  (args){
      return  Array.prototype.slice.call( args , 0  );
}
  //  简单实现事件的绑定 
Dojo.prototype.click =  function  (fn){
      this .event[ this .dom.gid] =  this .event[ this .dom.gid] ||  [];
      var  i = j = 0 ;
      var  self =  this  ;
      if  (Dojo.Util.isFunction( fn )){
          for (;i< this .dom.length;i++ ){
              this .dom[i].addEventListener('click' ,  function  (e,data){
                fn.call(self,e,data);        
            } ,  false  );
        }
    }

}
Dojo.prototype.trigger  =  function  (eventName,data){
      var  i = 0 ;
      if (! this  .event[eventName]){
          return  ;
    }
      for (len =  this .event[eventName].length;i<len;i++ ){
          this .event[eventName][i].apply( this  .dom,data);
    }
      return   this  ;
}
Dojo.prototype.init.prototype  =  Dojo.prototype;
  var  dom =  new  Dojo('dom' );
  //  为创建的dom对象增加自定义函数  
//  这里面就增加了两个一样的事件 
dom.addEvent("data-change", function  (){
    console.log(arguments);        
});
dom.addEvent( "data-change", function  (){
      var   arr;
    arr  =  Dojo.Util.ToArray(arguments);  
    alert(arr);        
});
  //  click的时候触发事件 
dom.click( function  (e){
      this .trigger("data-change",['a','c','d' ]);
}); 

  

  

作者: Leo_wl

    

出处: http://www.cnblogs.com/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于精通正则表达式(JavaScript)的详细内容...

  阅读:46次