呵呵,我们下班还要一会呢。研究了一下正向预查,明白了一点道理:alert("abcdef".match(/(?=abc)def/))
alert("abcdef".match(/(?=abc)...def/))它仅仅只是预查,预查成功后要记得当它不存在。

解决方案 »

  1.   

    为什么不
    s = s.replace(/(^|\D)(\d)(?=\D|$)/g,"$1"+0+"$2");
      

  2.   

    s = s.replace(/(^|\D)(\d)(?=\D|$)/g,"$1"+"0"+"$2");
    一语道破了,应该是可以啦把0加个引号吧
      

  3.   

    试过了,不行的,在netScape下面的结果一样是错的。s = s.replace(/(^|\D)(\d)(?=\D|$)/g,"$1"+0+"$2");

    s = s.replace(/(^|\D)(\d)(?=\D|$)/g,"$10$2");

    s = s.replace(/(^|\D)(\d)(?=\D|$)/g,"$1\x30$2");都一样,因为字符串会被先计算后才当参数串给replace,所以歧义一样存在。
      

  4.   

    呵呵,又在钻牛角尖了。按javascript的规则,正则表达式中分组结果是保存在RegExp对象中的,且只保存9个。而re.exec可返回全部的括号对。我以为netScape忠实的遵守了这一规则,而ie有所变通。所以ie中的叫jscript而不是javascript。jscript是javascript的超集。jscript能做的javascript不一定能做。
      

  5.   

    funboy88参加红军啦!xuzuning(唠叨) :你没看清楚,现在的问题不是IE变通了而是NS变通了呵呵,要是NS不认识$10的话哪来那么多事?闲话少说,谁快帮我写一个不出现$10这样的东西的正则啊?
      

  6.   

    try:
    <script>
    s="1/01/2/3/4/04/5";
    s=s.replace(/0/g,'')
    s = s.replace(/(\d)(?=\/|$)/g,"0$1");
    alert(s);
    </script>
      

  7.   

    fason
    试试
    s="11/22/33/44/55";再说要用两个正则的话我早就有了。
      

  8.   

    我知道啦,研究了很久了
    <script>
    var s="1/01/22/3/4/04/5";
    var reg=/\b(\d)\b/g;
    s=s.replace(reg,"0$1");
    alert(s);
    </script>
      

  9.   

    嗯,使用单词边界符,这个倒真的没想过。
    whyman(湿文) 正解,晚上结帖。
      

  10.   

    噢,也不成:<SCRIPT LANGUAGE="JavaScript">
    <!--
    s="a1/b1/c2/d3/e4f/4g/h5";
    s = s.replace(/(^|\D)(\d)(?=\D|$)/g,"$1~$2").replace(/~/g,"0");
    alert(s);
    s="a1/b1/c2/d3/e4f/4g/h5";
    var reg=/\b(\d)\b/g;
    s=s.replace(reg,"0$1");
    alert(s);
    //-->
    </SCRIPT>其实单词分界在这里实现的功能和我要求的“用一个正则将一个串中的单一个的数字改为两位的0?格式”并不相符。我需要的是“数字分界”。
      

  11.   

    简单,小菜一碟(你们想得太复杂了):
    s="1/01/2/3/4/04/5";
    s = s.replace(/(^|\D)(\d)(?=\D|$)/g,"$1"+"0$2");
      

  12.   

    wo lai ding yi xia
      

  13.   

    s="1/01/2/3/4/04/5";
    s = s.replace(/(^|\D)(\d)(?=\D|$)/g,"$1"+"0$2");
    这个能用嘛?
    这个可能不行吧
      

  14.   

    我已经在我单位linux服务器上的Netscape通过验证,这用不着怀疑。但Winodws下我没安装Netscape,没验证,估计不应出现问题。
      

  15.   

    cnlyl(海龙王) :在ns上和fason(【阿信(你是我的温柔)】) 的结果一样。因为"$1"+"0$2"会先被计算,得出结果“$10$2”之后才被当参数传给replace,所以在ns6下面不通过。
      

  16.   

    等我在找个低版本的在Windows下琢磨琢磨。
      

  17.   

    终极揭贴篇!!!
    再不揭贴,本龙王就从一楼跳下去自尽——真的无颜面对大家!!!
    敬爱的朱总理曾经说过:"emu (ston) 那坏东西,出了一个什么正则表达式,海龙王不知是计,绞尽脑汁,暝思哭想,白发人都想成了黑发人!最终解决了问题"

    今天下午,我翻出了一个Netscape 4.77装上,开始我的苦难之旅:
    Netscape 4.77好象不支持?=正则表达式,使用/(/(^|\D)(\d)(?=\D|$)/g;浏览器老是报错,根本进不去,我改成/(^|\D)0*(\d)/g;好了。
    解决问题的主要思想是,穷尽一切办法不让"$1"+"0$2"中的$1与其后的0媾和、发生奸情。
    知道replace函数是先将"$1"+"0$2"串接起来,再替换,但还是想Netscape兴许有Bug或借助Netscape实现上的不同,希望奇迹发生。于是就在"$1"和"0$2"之间插入\0、、\0x00等等,都不行;["$1"]+["0$2"]、["$1","0$2"].join("")、{a:"$1"}.a+"0"+{b:"$2"}.b等能想到的都试了,也不行;当然会想到使用eavl函数,还是不行。这些方法实际结果都是"$10$2";
    又想起了unix中的shell变量可以用{}界定变量名,如,${red}1,兴许在javascript也可以用,于是用"${1}0${2}"、"{$1}0{$2}"等等,不行;
    又想起那个游戏机厂商M$的错误连篇的JScript.chm中说匹配结果从1、199,那么$199应该有定义,而且在我们的例子中应该是空串,于是用"$1$199"+"0$2",结果Netscape还是用了$1990,我就不信,看它能用多大!就用"$1$999"+"0$2"、"$1$999999"+"0$2"、"$1$9999999"+"0$2"等,还是与后面的0结合,一怒之下,用15个9:"$1$999999999999999" + "0$2",结果为:9999901/9999901/9999902/... 有门,再用10个9:"$1$9999999999" + "0$2",久违的结果终于出现在我的眼前:01/01/02/... 我高兴啊.... 简直比看见公鸡下蛋还要高兴!!!完了吗?还没有哪...
    狂喜之后,想看IE中的结果,结果一盆凉水浇得我透心晾:状态条上显示结果为:$999999999901/$999999999901/$999999999902/...
    用?构造一个表达式:s = s.replace(/(^|\D)0*(\d)/g, document.all ? "$10$2" : "$1$9999999999" + "0$2" );在两种浏览器下都通过了。
    最后想到每次匹配成功,都要进行?表达式求值,不行!这里存在程序优化中的表达式外提问题,将表达式外提,最终程序为:var s="01/1/2/3/4/04/5";
    var cExpress = ( document.all ? "$10$2" : "$1$9999999999" + "0$2" );
    s = s.replace(/(^|\D)0*(\d)/g, cExpress ); 
    status=s;  //状态栏显示结果最后我要说的是:emu (ston) 出的这个妖蛾子,害人害己(至少把我给害了)!还我白发,否则,我死不瞑目!!!
      

  18.   

    我真的不想看到你跳楼,可是,
    var s="01/1/2/3/4/04/5";
    var cExpress = ( document.all ? "$10$2" : "$1$9999999999" + "0$2" );
    s = s.replace(/(^|\D)0*(\d)/g, cExpress ); 
    document.write(s)在netscape6.0下的运行结果是:9999999901/9999999901/9999999902/9999999903/9999999904/9999999904/9999999905
    你就安心的去吧,人民会想念你的 :)$9999999999不是一个正规的正则写法,就算现在碰巧能通过了,也无法被接受为标准答案。此外,cExpress = ( document.all ? "$10$2" : "$1$9999999999" + "0$2" ); 这个写法好奇怪,为什么不是 cExpress = ( document.all ? "$10$2" : "$1$99999999990$2" ); 呢?是否惯性思维所致?不过通过上面这篇文章,cnlyl(海龙王)的正则功底和钻研精神大家已经有目共睹了。高手,javascript版需要你,csdn需要你!
      

  19.   

    按照cnlyl(海龙王)的方法在NS6.0下的写法应该为:var s="01/1/2/3/4/04/5";
    var cExpress = ( document.all ? "$10$2" : "$1$990$2" );
    s = s.replace(/(^|\D)0*(\d)/g, cExpress ); 
    document.write(s);不过这个写法在ns4.7和ns7下面大概都不会对,难道我们还要对不同的版本各写一个?毕竟我们不是想要一个将就着能通过的写法,不然s = s.replace(/(^|\D)0*(\d)/g,"$1~$2").replace(/~/g,"0");就已经够了。我们想要的是一个规范的通用的没有歧义的正则。
      

  20.   

    对不起,s = s.replace(/(^|\D)0*(\d)/g,"$1~$2").replace(/~/g,"0");是错的,不用预查恐怕不能正确的匹配。试试:var s="01/11/21/31/4/04/5";
    s = s.replace(/(^|\D)0*(\d)/g,"$1~$2").replace(/~/g,"0");11变成011了,所以到现在正确的写法还是只有:var s="01/11/21/31/4/04/5";
    s = s.replace(/(^|\D)(\d)(?=\D|$)/g,"$1~$2").replace(/~/g,"0");
      

  21.   

    要没有歧义,前面的几种写法都算是规范的没有歧义的写法了。但是问题不在这里,而是在各种不同的浏览器版本的bug上。所以说,统一浏览器还是大家所希望看到的事情。呵呵,话题偏离技术了,我闪。
      

  22.   

    -----------------------------------------------
    所以说,统一浏览器还是大家所希望看到的事情。
    -----------------------------------------------恐怕我是个例外。如果真的统一了,以后linux从此不能上网了,桌面系统也就由微软一统天下了,这对大家有什么好处?是否接下来统一服务器平台,统一数据库平台,统一开发平台,也都会渐渐成为“大家希望看到的事情”呢?整个世界统一在一个以营利为目的的商业软件公司之下,你放心吗?----------------------------------------------------------------
    微软将淘汰单机IE浏览器 IE 6 SP1成最后版本
    http://www.csdn.net/news/newstopic/11/11173.shtml
    ----------------------------------------------------------------这样的统一是我们希望的吗?
      

  23.   

    哈哈!我昨天给出的方法成功地避免了$10问题,不算成功吗???
    问题的关键是要穷尽一切办法不让"$1"+"0$2"中的$1与其后的0结合。如果能直接应用$1、$2的值用replace(oPattern, ($1)+"0"+$2 )就行了。但令人遗憾的是在replace中$1、$2引用必须用引号,也就是字符串套字符串"$1"、"$2",象用函数等方法隔开$10$2,是行不通的。
    不同厂商甚至同一厂商不同版本的浏览器,在正则表达式匹配上由于bug或实现上是不同的,"想要一个规范的通用的没有歧义的正则",我认为是不可能。
    跟if ( ns )、if ( IE )方法一样。我昨天给出的方法已经算是通用的了:写一个函数,分几种情况,为几个不同版本浏览器定义Express,然后,replace(oPattern, Express ),没有什么不好啊?
    昨天,我也试过用RegExp.$1、RegExp.$2,可以直接引用,不存在字符串套字符串的问题,不过它是最后匹配结果,因此,昨天我放弃了。今天,我又拾起这个想法:在我们的问题中,字符串的定界符如果相同,如本例的/,那么我们可以使用RegExp.$1:var s = "01/1/2/3/4/04/5";
    s = s.replace(/(^|\D)0*(\d)/g, RegExp.$1+"0$2");
    status = s;Netscape 4.77得到了希望的结果:/01/01/02...   RegExp.$1使用的是当前正则(\D)最后匹配结果(验证:如果s="01/1/2/3/4/04~5";结果为:~01~01~02...);
    而那游戏机厂商的IE,运行的到的结果是:010102... RegExp.$1用的是空串,实际它是引用上次正则函数(包括其他函数)匹配的结果,即,RegExp.$1值不确定。验证:将程序重复两边得到希望的结果:// IE:var s = "01/1/2/3/4/04/5";
    s = s.replace(/(^|\D)0*(\d)/g, RegExp.$1+"0$2");
    var s = "01/1/2/3/4/04/5";
    s = s.replace(/(^|\D)0*(\d)/g, RegExp.$1+"0$2");
    status = s;
    
    既然RegExp.$1问题基本弄清楚了,通用的方法也就有了://Netscape 4.77 && IEvar s = "01/1/2/3/4/04/5";
    s.match ( /(\D)/ );   // 特别为Xbox厂商的IE RegExp.$1取得第一个定界符
    s = s.replace(/(^|\D)0*(\d)/g, RegExp.$1+"0$2");
    status = s;但,这个方法有它的局限性:
    1.如果源s的第一个字符不是定界符,将多一个定界符。如果这不是你所希望的,可以在函数中用return(s.substr(1,s.length-1));返回你希望的结果;
    2.使用的是第一个定界符, 如s="1/1A2B3C4D04~5"; 返回:/01/01/02/03/04/05。如果你确保源字符串中的定界符都一样或这种结果就是你所希望的,上面的方法应该是比较通用的。从Netscape 4.77不支持正则预查和RegExp.$1等问题上,emu (ston)想要的"想要的是一个规范的通用的没有歧义的正则",窃以为简直是想要海市蜃楼,无异于想让公鸡下蛋,母鸡打鸣!呵呵....注意:上面的RegExp.$1、RegExp.$2...的说明只是针对replace()方法,我想在match()、exec()、test()等方法调用后,RegExp.$1、RegExp.$2应该与参考手册相同...至于昨天cExpress = ( document.all ? "$10$2" : "$1$9999999999" + "0$2" )的写法,昨天写帖子时我想到了。只是为了突出$9999999,区分$99999999990。本龙王最擅长构造简单、晦涩难懂的表达式和行数少的程序,构造正则更是如此,我写的东西被别人称为具有"只写"属性,没有"读"属性。
    这个问题我不再发帖子了!
    我用javascript没几天,单位的一个任务(正则是我使用unix、linux熟悉的)。有些问题还要请教,希望大家帮忙!
      

  24.   

    感谢cnlyl(海龙王)的热心支持,结帖!