zoukankan      html  css  js  c++  java
  • 20080408 Javascript中的字符串替换replaceG


    Javascript中的字符串替换会用到其内置对象String的replace方法。
    原型如下:stringObj.replace(rgExp, replaceText);

    先看一个例子:考虑如下网页代码会弹出什么结果?
    <script>
      alert("111".replace("1", "2"));
    </script>
    对了,是"211",而不是"222"。
    就是说,Javascript的字符串替换只处理第一次匹配,而一般,这不是预期效果。

    要实现结果为"222",正确的做法是,对第一个参数传入正则表达式对象。代码如下:
    <script>
      alert("111".replace(/1/g, "2"));
    </script>

    /1/g是一个javascript语法的正则表达式,g代表打开全局替换选项。
    这种正则表达式语法是预编译语法,还有另一种创建正则表达式对象的语法:
    re = new RegExp("1","g"),这种一般适合表达式不确定时使用。
    并且可用RegExp.compile方法编译,加快正则的处理速度。

    不知道javascript的设计者为什么会设计出这种怪异的正则语法: /pattern/[flags]
    例如去匹配*会需要先转义,应写成/\*/g,但这样就无法用/* */去注释此行。
    又如去匹配/,仅写成/\//g显然不行,因为后续两个//为javascript的注释符,
    这时,可写成/^\/$/g,^和$在正则里分别代表开始和结尾。

    另外,要注意这里的g标志和递归调用replace的效果不同。看例二:
    <script>
      var s1 = "122212".replace("12", "1").replace("12", "1").replace("12", "1").replace("12", "1");
      var s2 = "122212".replace(/12/g, "1");
      alert("递归调用替换:s1 = \"" + s1 + "\"");
      alert("正则g选项替换:s2 = \"" + s2 + "\"");
    </script>
    结果是差别很大。

    实际,对于stringObj.replace(rgExp, replaceText)方法,实际上有一个“重载”。
    当rgExp参数仅为字符串时,作单次替换;当rgExp为正则表达式的pattern时,才做正则替换。
    为了实现带g开关的字符串替换,我们可以利用prototype给String对象加入一个replaceG方法。
    <script>
      String.prototype.replaceG = function(sOldValue, sNewValue){
          var re = new RegExp(sOldValue, "g");
          this.replace(re, sNewValue);
      }
      alert("111".replaceG("1", "2"));
    </script>

    之后,再看看结果,已经是"222"了。

  • 相关阅读:
    git 只添加cpp文件
    URI和URL学习
    scanpy中常用函数
    特征去量纲方法
    排列组合数计算公式
    UML图
    行测图形推理笔记-
    nis服务器实现用户帐号管理同步
    rsh配置双方主机免密
    两周实习的总结
  • 原文地址:https://www.cnblogs.com/likun/p/1141773.html
Copyright © 2011-2022 走看看