var s = "This is a {0}, test {{0} {1}.";
本想只匹配红色 {0},而不匹配 {{0},但费了半天劲儿,也没写出来,一查才发现 js 不支持 向后查找!有人提出将字符串和表达式反转后,再应用向前查找。各位高手有啥妙招没?!还有就是 js 为啥不支持向后查找呢?!

解决方案 »

  1.   


    <script type="text/javascript">
    <!--
    var s = "This is a {0}, test {{0} {1}.";
    var reg = /\s(?=\{0\})\{0\}/
    alert(s.match(reg))
    //-->
    </script>
      

  2.   

    呵呵,这么写也太特例了吧,没有空格时岂不玩完了?!
    var s = "This is a{0}, test {{0} {1}."; // 这种情况就是 null
      

  3.   


    那也起码得有个参照物吧?<script type="text/javascript">
    <!--
        var s = "This is a {0}, test {{0} {1}.";
        var reg = /[^{](?=\{0\})\{0\}/; //这样也不能算特例其实,,
        alert(s.match(reg))
    //-->
    </script>
      

  4.   

    而且这个正则还包含了 前导空格,结果是“ {0}”,并非“{0}”!其实俺是想在 js 中实现类似 C# 中 String.Format 滴功能,
    但是匹配占位符时遇到了麻烦!
      

  5.   

    其实最好就是用 负向后查找 (?<!),但是 js 只有 负向前查找 (?!),
    这就直接导致需要应用 负向后查找 时滴困境?!其实如果 js 支持 负向后查找 滴话, 
    var reg = /(?<!{)\{0}/g;
    就是最佳答案,可惜 js 不支持!
      

  6.   

    兄弟滴解释俺再仔细看看,读了两遍没明白,嘿嘿{{0}的{0}不可以吗,还有其他情况呢?其实,只有这种情况,因为将 { 作为占位符使用,
    当需要显示 { 时就表示为 {{ (.NET 中 String.Format 就是这么处理滴),
    x{0},只要 x 不是 {,就要把 {0} 提取出来。var reg = /(?<!{)\{0}/g;
    可惜 js 中不能用!
      

  7.   

    多谢各位兄弟捧场!俺找到一个解决方案,大家一起学习Mimicking Lookbehind in JavaScript
    http://blog.stevenlevithan.com/archives/mimic-lookbehind-javascript一种介绍了三种方法,第一种方法应该就能解决俺滴问题,稍后贴出来;
    第三种方法据说很强大,还没看懂,哈
      

  8.   


    //Try it.
    var s = "This is a {0}, test {{0} {1}."; 
    var arr=['[Replace 1]','[replace 2]','[replace 3]' ];
    var regex=/(\{+)(\d+)(\}+)/g;
    var _index='';
    var result= s.replace(regex,function(){
    if(arguments[1].length!=1||arguments[3].length!=1) return arguments[0];
    _index=arguments[2]-0;
    if(_index<arr.length&&_index>=0)return arr[_index];
    });
    alert(result);
      

  9.   

    String.format 已实现,欢迎大家指正!L@_@K
    /*
     * summary: 将指定的 String 中的每个格式(例如:{0}, {1}等)项替换为相应对象的值的文本等效项。
     *          需显示左大括号时,应输入双左大括号,即 "{{" 。
     *
     * parameter:
     *     fmtStr@string: 包含零个或多个格式项。
     *     paramsArray@paramsObject[]: 包含零个或多个要格式化的对象的 Object 数组。
     *
     * return: fmtStr 的一个副本,其中格式项已替换为 paramsArray 中相应 Object 实例的 String 等效项。
     *
     * example: document.write(String.format("hello, {0}, {1}!<br />keey {{{{2}}", "world", 123));
     */
    String.format = function(fmtStr, paramsArray) {
    var output = fmtStr;
    var re;
    var valueArray; if (paramsArray instanceof Array)
    valueArray = paramsArray
    else
    {
    valueArray = new Array();
    for (var i=1; i<arguments.length; i++)
    valueArray.push(arguments[i]);
    } for (var i=0; i<valueArray.length; i++)
    {
    re = new RegExp("(\\{)?\\{"+i+"}", "g");
    output = output.replace(re, function($0, $1){
    return $1 ? $0 : valueArray[i];
    });
    } return output.replace(new RegExp("\\{\\{", "g"), "{");
    };document.write(String.format("hello, {0}, {1}!<br />keey {{{{2}}", "world", 123));
      

  10.   


    //参考提供的网址修改一下
    var s = "This is a {0}, test {{0} {1}."; 
    var arr=['[Replace 1]','[replace 2]','[replace 3]' ];
    //var regex=/(\{+)(\d+)(\}+)/g;
    var regex=/(\{+)?{(\d+)}(?!\}+)?/g;
    var _index='';
    var result= s.replace(regex,function(){
    if(arguments[1]) return arguments[0];
    _index=arguments[2]-0;
    if(_index<arr.length&&_index>=0)return arr[_index];
    });
    /*
    var result= s.replace(regex,function(){
    if(arguments[1].length!=1||arguments[3].length!=1) return arguments[0];
    _index=arguments[2]-0;
    if(_index<arr.length&&_index>=0)return arr[_index];
    });
    */
    alert(result);