• js方法的使用(z)


    http://www.108js.com/article/article1/10025.html?id=58

    javascript中正则匹配有3个方法,match,exec,test。这些方法都跟字符串和RegExp对象有关,但使用场景不一样,容易混淆。match是字符串的一个方法,接收一个RegExp对象做为参数,其他的是RegExp对象的方法,接收一个字符串参数。

    <script>
      var str = 'abcdef12ab34cd56ef';
      var patt = new RegExp('ab'); //注意是非全局匹配
      var ret_test = patt.test(str);
      alert(ret_test);

      var ret_match = str.match(patt);
      alert(ret_match);

      var ret_exec = patt.exec(str);
      alert(ret_exec);
    </script>

    点击观看效果

        

    1. regExp.test(string)

      该方法最简单,在string中找到匹配regExp的字符串则返回true,没找到匹配的字符串则返回false

    2. regExp.exec(string)

      该方法稍微复杂些。

      当regExp没有全局标志时,其返回值为字符串数组:数组的第0号元素为刚匹配到的字符串,如果regExp有子表达式,则数组第1号元素为regExp的第一个子表达式,第2号元素为regExp的第二个字表达式...以此类推。在上例中如果
    patt = new RegExp('f(\d)(\d)','g');则 ret_exec 将为字符串数组:['f12','1','2']。

      在设置g属性后,虽然匹配结果不受g的影响,返回结果仍然是一个数组(第一个值是第一个匹配到的字符串,以后的为分组匹配内容),但是会改变index和lastIndex等的值,将该对象的匹配的开始位置设置到紧接这匹配子串的字符位置,当第二次调用exec时,将从lastIndex所指示的字符位置开始检索。同样match方法在设置了g属性后,也会改变index和lastIndex的值,但是是一次性的。无法像exec那样能逐过程累积,因此无法累积获取下一次检索的位置。
    <script>
      var patt = new RegExp('ab', 'g');
      var str = 'abcdef12ab34cd56ef';
      var ret;
      while((ret = patt.exec(str))!=null) {
        document.write(ret+"</br>");
        document.write("ret.input="+ret.input+"</br>");
        document.write("ret.index="+ret.index+"</br>");
        document.write("RegExp.lastIndex ="+RegExp.lastIndex +"</br>");

      }
    </script>

    运行:
    ab
    ret.input=abcdef12ab34cd56ef
    ret.index=0
    RegExp.lastIndex =2
    ab
    ret.input=abcdef12ab34cd56ef
    ret.index=8
    RegExp.lastIndex =10


    exec方法返回的不是标准的数组,应该算是一个类数组,因为它还有2个属性:input是输入的字符串,index是当前匹配的字符串第一个字符在input中的位置。

    3. string.match(regExp)

      该方法比exec简单一些,因为它不用考虑regExp的lastIndex属性。同样,也需要分两种情况(全局匹配与非全局匹配)

      当regExp没有全局标志时,返回值与调用exec一样,返回一个数组,数组的第0号元素为刚匹配到的字符串,如果regExp有子表达式,则数组第1号元素为regExp的第一个子表达式,第2号元素为regExp的第二个字表达式...以此类推。主意该数组同时还有2个属性:input是输入的字符串string,index是当前匹配的字符串第一个字符在input中的位置。

      当regExp有全局标志(g选项)时,很简单,也符合我们的理解:返回所有匹配到的字符串组成的数组。这是标准数组,没有input属性,也没有index属性。返回值数组中除了匹配到的字符串没有任何其他信息。

    <script>
      var src = "The rain in Spain falls mainly in the plain.";
      var re = /w+/g; //有g属性。
      var i = 0;
      while (i++<10){
       arr = src.match(re);
       document.write(RegExp.index + "-" + RegExp.lastIndex + " " + arr + "<br/>");

      }
    </script>

    运行:
    38-43 The,rain,in,Spain,falls,mainly,in,the,plain
    38-43 The,rain,in,Spain,falls,mainly,in,the,plain
    38-43 The,rain,in,Spain,falls,mainly,in,the,plain
    38-43 The,rain,in,Spain,falls,mainly,in,the,plain
    38-43 The,rain,in,Spain,falls,mainly,in,the,plain
    38-43 The,rain,in,Spain,falls,mainly,in,the,plain
    38-43 The,rain,in,Spain,falls,mainly,in,the,plain
    38-43 The,rain,in,Spain,falls,mainly,in,the,plain
    38-43 The,rain,in,Spain,falls,mainly,in,the,plain
    38-43 The,rain,in,Spain,falls,mainly,in,the,plain

      从上面的分析看出,如果你只是想判断字符串是否匹配某个正则表达式,就用test方法。如果想一次性取出所有匹配到的字符串,或者只找到第一个匹配的字符串就可以,就用match方法。如果你想多次匹配,而且需要知道每个匹配到的字符串在原始字符串中的位置,或者正则表达式中还有子表达式信息需要关注,就用exec方法。

    测试题:
    var someText="web2.0 .net2.0";
    var pattern=/(w+)(d).(d)/g;
    var outCome_exec=pattern.exec(someText);
    var outCome_matc=someText.match(pattern);

    What is outCome_exec[1] and outCome_matc[1]??

    Choice A: true
    Choice B: false
    Choice C: null
    Choice D: Web
    Choice E: Web2.0
    Choice F: undefined
    Choice G: net2.0

    答案为D和G。你想明白了么?

  • 相关阅读:
    Windows Forms中通过自定义组件实现统一的数据验证(二)
    The WindowsClient.NET Community Site Launches
    二十六岁,仍在路上
    Visual Studio 2008 Express版本下载
    Page Controller及其在ASP.NET中的实现
    iBATIS In Action:使用映射语句(二)
    在VS2005中创建项目模板来提高开发效率
    2007年,听见春天的脚步
    iBATIS In Action:使用映射语句(一)
    iBATIS In Action:序言和目录
  • 原文地址:https://www.cnblogs.com/ryhan/p/5903156.html
Copyright © 2020-2023  润新知