我是FE,也是Fe

          前端來源于不斷的點滴積累。我一直在努力。

          統計

          留言簿(15)

          閱讀排行榜

          評論排行榜

          使用正則替換textarea種的重復行

          有這么個需求,將textarea中的重復行去掉。結果將每行join(",")。

          最開始拿到這個需求時,想當然的這么寫了:
                  var s ="a\r\na\r\naa\r\nc\r\nc\r\nc\r\n\r\nb\r\nb\r\n";

                  
          var o={},//記錄不重復的行
                      arr= s.split(/\r?\n/gi),//取到textarea值時IE中的回車是\r\n,!IE只是\n
                      i=arr.length,
                      result
          ="";
                  
          while(i--){
                      
          if(arr[i] && (!o[arr[i]])) o[arr[i]]=1;
                  }
                  
          for (var k in o ){
                      
          if(result!="") result=result+",";
                      result
          +=k;
                  }
                  alert(result);

          沒有問題,很常規的做法。后來總想是不是可以用正則去做這個事情,順便可以溫習一下正則,經反復測試,寫出了一個下面的代碼:
          var s ="a\r\na\r\naa\r\nc\r\nc\r\nc\r\n\r\nb\r\nb\r\n";
                  
          var regResult =s.replace(/\r?\n/gi,",")  // \r\n->,
                      .replace(/((\,[^\,]+)|(^[^\,]+))(?=((.*\1\,)|(.*\1$)))/gi,"")        //去除重復
                      .replace(/^\,|\,$|\,(?=\,)/gi,"");//去掉多余的,
                  alert(regResult);

          就這么個正則折騰了一上午,當然,字符串也是取了一個比較極端的情況,比如即有a又有aa (行內容包含的情況),3次出現的情況,首尾重復的情況。

          去除重復的正則用了寬度斷言和反響引用。所謂寬度斷言就是可以判斷后面/前面的匹配,但是不占用匹配的位置,也就是不影響后面的匹配,他只是一種斷言,比如上面的(?=reg),就是正向寬度斷言,能斷言后面的出現了之前匹配組內容。反向引用時指可以引用之前匹配的引用組,比如上面的去除重復中的正則\1 就反向應用了第一個匹配組((\,[^\,]+)|(^[^\,]+)) 匹配的內容。

          當然,上面的正則肯定不是最優的,希望大家指點了。

          可以參考正則表達式30分鐘教程
          正則的寬度斷言 http://deerchao.net/tutorials/regex/regex.htm#lookaround
          負向寬度斷言&反向引用:http://deerchao.net/tutorials/regex/regex.htm#negativelookaround



          posted on 2011-06-17 12:16 衡鋒 閱讀(856) 評論(3)  編輯  收藏 所屬分類: javascript

          評論

          # re: 使用正則替換textarea種的重復行 2011-06-17 20:48 bility

          It's very good.

          but,if this code appear in your project,I think this will driving someone mad.  回復  更多評論   

          # re: 使用正則替換textarea種的重復行 2011-06-17 22:19 陽衡鋒

          @bility
          可能正則并不適合于寫業務代碼。可讀性,可維護性比較差。  回復  更多評論   

          # re: 使用正則替換textarea種的重復行 2011-09-15 08:34 tbw

          非常不錯啊   回復  更多評論   

          主站蜘蛛池模板: 根河市| 巴青县| 子洲县| 广河县| 巴彦县| 定边县| 南雄市| 金塔县| 海丰县| 东明县| 定陶县| 杭锦旗| 义马市| 乌什县| 建湖县| 阳西县| 武邑县| 潜山县| 泾阳县| 平遥县| 郎溪县| 滨州市| 叶城县| 麦盖提县| 含山县| 安徽省| 博罗县| 桃江县| 洪雅县| 梧州市| 昌邑市| 句容市| 隆化县| 疏附县| 定安县| 锡林浩特市| 阿拉善右旗| 成安县| 泸水县| 修水县| 岑巩县|