wcwtitxu大哥,在贴子
http://topic.csdn.net/u/20090430/15/8562e58c-99ae-41fe-b6e7-cb1bd6a867ae.html
中,你在24楼提到了关于消除不必要的空格及数字中多余的零的问题!!
但经我测试发现,有一定的BUG(比如在数值和右括号之间的空格仍然无法消除)!为了更好说明上述问题,我已经找到了相关规律,但在实现上也出现了一些问题,现将示例如下:1).假设有一个字符串:
"  astring( ( 10  20   ) ,  (20     15)   ,  (20   15 )  )"
经处理后能够得到:
"astring((10 20),(20 15),(20 15))"2).另一字符串:
" bstring( ( 10   10, 10   20, 20     20, 20   15, 10  10) ,  (20 15, 5   5, 10  10, 20 15) ) "
经处理后能够得到:
"bstring((10 10,10 20,20 20,20 15,10 10),(20 15,5 5,10 10,20 15))"3).再有一字符串:
"   cstring(  (    10 10  ,20 15 )  ,( 10 10  ,20   15 ,5    7) ) "
经处理后能够得到:
"cstring((10 10,20 15),(10 10,20 15 ,5 7))"
规律如下:
(1).坐标对(已做部分紫色标记)之间任意个空格经处理之后,只有一个空格;
(2).除1的情况外,其余所有空格(或者说空白)字符都需消除!!
虽然我能以(\d+\s*\d+)的形式捕捉到一个坐标对及间空格,但发现利用replace函数却无法替换成我想替换的格式!!!
PS:各位大哥也可不必理会此贴中标明的另一个超链接,从而直接针对本贴问题进行解答.

解决方案 »

  1.   


    str = str.replace(/^\s*|\s*$|\s*([)(,\s])\s*/g, "$1");
      

  2.   

    str = str.replace(/\s*([)(,\s])\s*/g, "$1");
    LS的可以简化吧
      

  3.   

    TO:wcwtitxu
    其实你在我的另一贴的24楼里写了这么一句:str = str.replace(/\s*?([(, )]|^|$)\s*/g, "$1"); // 去掉无所谓的空格
    当时我测试时有问题,不过后来我自己把你那句中出现的问号去掉了,似乎就OK了也即如下:
    str = str.replace(/\s*[/color]([(, )]|^|$)\s*/g, "$1"); // 去掉无所谓的空格但你在一楼,怎么把 |^|$ 去了,开始和结尾就不用考虑了吗?
      

  4.   

    也即如下: 
    str = str.replace(/\s*[/color]([(, )]|^|$)\s*/g, "$1"); // 去掉无所谓的空格 
    修正为:
    也即如下: 
    str = str.replace(/\s*([(, )]|^|$)\s*/g, "$1"); // 去掉无所谓的空格 
      

  5.   


    /*
    原来这样子   \s*?([(,)\s]|^|$)\s*
    昨晚测试时 发现不但不能去掉 数值和右括号之间的空格
    字符串首尾的空格也没有剃光,还留有一个.  虽然中间有 ^ 跟 $,  但这两个并没有起作用 捕获组1 总是匹配到一个空格
    像:
    */
    var str = "        abc        ";
    str = str.replace(/\s*?([(,)\s]|^|$)\s*/g, "$1");
    // 然后  str==" abc ";  前后还有一个空格
    /*
    所以我昨晚 把前面的\s*?换成贪婪模式后,
    把 \s*([(,)\s])\s* 跟 ^\s* 和 \s*$
    三部分用 | 写成分支形式  就是一楼的那个样子了
    */
    // 下面这样子应该也可以了吧
    var regex = /^\s+|\s*([)(,\s]|$)\s*/g;
    str = str.replace(regex, "$1");
      

  6.   


    (2)
    str = str.replace(/\s*([(, )]|^|$)\s*/g, "$1"); // 去掉无所谓的空格 
    将第2种的改为如下:
    str = str.replace(/\s*([(, )]|$)\s*/g, "$1"); // 去掉无所谓的空格
    是否比第1种考虑还更简单些呢?
      

  7.   

    <script>
    var re=/\s*([)(,\s])\s*/g;
    var str1="  astring( ( 10  20  ) ,  (20    15)  ,  (20  15 )  )" 
    var str2=" bstring( ( 10  10, 10  20, 20    20, 20  15, 10  10) ,  (20 15, 5  5, 10  10, 20 15) ) " 
    var str3="  cstring(  (    10 10  ,20 15 )  ,( 10 10  ,20  15 ,5    7) ) " 
    document.write(str1.replace(re, "$1")+"测试还有空格没")
    document.write("<br>")
    document.write(str2.replace(re, "$1")+"测试还有空格没")
    document.write("<br>")
    document.write(str3.replace(re, "$1")+"测试还有空格没")
    </script>    
      

  8.   

    <script type="text/javascript">
    window.onload = function() {
      var strs = [
        '  astring( ( 10  20  ) ,  (20    15)  ,  (20  15 )  )',
        'bstring( ( 10  10, 10  20, 20    20, 20  15, 10  10) ,  (20 15, 5  \n 5, 10  10, 20 15) ) ',
        '  cstring(  (    10 10  ,20 15 )  ,( 10 10  ,20  15 ,5    7) ) '
      ];
      for(var i = 0; i < strs.length; i++) {
        strs[i] = strs[i].replace(/([0-9]\s)\s*(?=[0-9])|\s+/g, '$1');
        alert('|' + strs[i] + '|');
      }
    }
    </script>IE 7 和 FF 3 下是正确的。
      

  9.   

    var s = '  astring( ( 10  20  ) ,  (20\n    15)  ,  (20  15 )  )';为了避免像上面这种数字后面直接是个换行符之类的情况出现,再改一下代码:<script type="text/javascript">
    window.onload = function() {
      var strs = [
        '  astring( ( 10  20  ) ,  (20\n    15)  ,  (20  15 )  )',
        'bstring( ( 10  10, 10  20, 20    20, 20  15, 10  10) ,  (20 15, 5  \n 5, 10  10, 20 15) ) ',
        '  cstring(  (    10 10  ,20 15 )  ,( 10 10  ,20  15 ,5    7) ) '
      ];
      for(var i = 0; i < strs.length; i++) {
        strs[i] = strs[i].replace(/([0-9])\s+(?=[0-9])|\s+/g, function(a, b) {
              return b ? (b + ' ') : '';
            });
        alert('|' + strs[i] + '|');
      }
    }
    </script>
      

  10.   


    好哇!第一个数开头可能是负数
    (\d\s)\s*(?=[\d\-])|\s+
      

  11.   

    呵呵,谢谢 wcwtitxu 的提醒 ^_^
      

  12.   

    正在学javascript,正则确实挺麻烦的